Differences between revisions 6 and 17 (spanning 11 versions)
Revision 6 as of 2009-06-04 20:26:58
Size: 2517
Editor: GeoHump
Comment:
Revision 17 as of 2009-06-05 02:09:34
Size: 4685
Editor: GeoHump
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
Bash can do string operations. LOTS of string operations. This is an introduction to bash string operations for those new to Bash's special tool/feature called "Parameter Expansion", (PE),  with a focus on typical string operations.  Note Bash's Parameter Expansion, (PE), capability is a lot more powerful than the typical string manipulation calls you may be used to. There are some twists in the road up ahead. <<Anchor(faq100)>>
== How do I do string manipulations in bash? ==
Bash can do string operations. LOTS of string operations. This is an introduction to bash string operations for those new to Bash's special tool/feature called ''Parameter Expansion'' (PE), with a focus on typical string operations. (Note: much of this material is in [[BashFAQ/073|FAQ #73]]. It is being presented here with an approach inteneded to make it more accessable and more easily learned by people who have not had a lot of exposure to Bash.)
Line 3: Line 5:
Here is a list of some typical string manipulation functions/subroutines that you may already be familiar with: Note Bash's PE capability is a lot more powerful than the typical string manipulation calls you may be used to. There are some twists in the road up ahead. :)
Line 5: Line 7:
Here is a list of some typical string manipulation functions/subroutines that you may already be familiar with:
Line 9: Line 12:
 * midstr returns a string N chars long starting from offset K chars from the beginning/end
 * substr returns  copy of the string with all instances matching a patter replaced with a new string
 * midstr returns a string N chars long starting from an offset K chars from the beginning/end
 * substr substitutes all instances of a pattern with a new string
Line 13: Line 16:
 * getext returns a filenames extension
 * dropext returns the filename without its extension.
Line 16: Line 17:
This article will cover how to do all of these using the Bash PE and will introduce the more powerful actions available with PE's. Pleasenote there is a BashFaq about PE's already. That FAQ covers more of the scope of PE capabilities, where this one instead focuses on string operations. Two that you haven't heard of but would want to use all the time when scripting on *NIX:
 * getext returns a filename's extension (eg. "txt", "mp3", "doc", "sxc", "html", etc. ... )
 * dropext returns the filename with the extension stripped off the end of the name.
Line 18: Line 21:
lets assume we have a string variable named fullpath whose value is "usr/home/JosephBaldwin/Its_only_Rock_and_Roll.mp3" This article will cover how to do all of these using the Bash and will introduce the more powerful actions available with Bash's PE's. Please note there is a BashFaq about PE's already. [[BashFAQ/073|FAQ #73]] covers a larger scope of PE capabilities, where this one focuses on string operations.
Line 20: Line 23:
=== Filename manipulation ===
Line 21: Line 25:
Lest say we have a bash variable named fullpath that contains "/usr/home/JosephBaldwin/Its_only_Rock_and_Roll.mp3"
Line 22: Line 27:
Naturally in scripting we would want to manipulate certain pieces of the path, like just the file name, which is the last component of the full path. So lets get just the filename from the full path: In *NIX we have the command "basename" which does this very nicely for us:
basename $fullpath returns "Its_only_Rock_and_Roll.mp3". In Bash we can do that much faster with this command: echo ${fullpath##*/}
Line 23: Line 30:
"WHAT? What the heck is that? Thats not a command! Thats just a bunch of garbage someone made by wacking in some of the stranger keys on the keyboard! I mean really! '' dollar curly pound pound star slash curly '' What IS that? "
Line 24: Line 32:
to perform a basename in bash we use the following PE expression: ${fullpath##*/} Um, OK - uh, just calm down for a moment. I know it doesn't look like the typical programming language keyword or library call, but consider a language like Perl. See? To shoehorn new features into Bash, you have to find ways to do it without creating keywords (or anything else) that might cause older scripts to break, so all these string manipulation functions got placed inside the syntax from an old sh feature where there just happened to be room for them. "Parameter expansion".
Line 26: Line 34:
to perform a dirname in bash we use the following PE expression: ${fullpath%/*} For a basename we use the PE expression: ${fullpath##*/} which returns "Its_only_Rock_and_Roll.mp3".
Line 28: Line 36:
to perform a dropext in bash we use the following PE expression: ${fullpath%.*} To find the dirname we use the PE expression: ${fullpath%/*} which produces "/usr/home/JosephBaldwin".
Line 30: Line 38:
to perform a droppre in bash we use the following PE expression: ${fullpath#*.} To drop the filename extesnion, we use the PE expression: ${fullpath%.*} giving out "/usr/home/JosephBaldwin/Its_only_Rock_and_Roll"
Line 32: Line 40:
to perform a getext  in bash we use the following PE expression: ${fullpath##*.} To get the filename's extension we use the PE expression: ${fullpath##*.}  generating only "mp3".
Line 34: Line 42:
to perform a strlen  in bash we use the following PE expression: ${#fullpath} To find the strlen the PE expression: ${#fullpath} finds it and its 49.
Line 36: Line 44:
to perform a leftstr in bash we use the following PE expression: ${fullpath:0:$2} To get a leftstr, the PE expression: ${fullpath:0:20} grabs the first 20 chars of fullpath to make "usr/home/JosephBaldw".usr/home/JosephBaldwin/Its_only_Roll_and_Roll.mp3
Line 38: Line 46:
to perform a rightstr in bash we use the following PE expression: ${fullpath:$(( 0 - $2 ))} To perform a rightstr in bash we use the following PE expression: ${fullpath:$(( 0 - 20 ))} which gets the last 20 chars, "ly_Rock_and_Roll.mp3".
Line 40: Line 48:
to perform a midstr in bash we use the following PE expression: ${fullpath:$2:$3} To perform a midstr in bash we use the following PE expression: ${fullpath:10:20} making "osephBaldwin/Its_onl"
Line 42: Line 50:
to perform a substr in bash we use the following PE expression: ${fullpath//$2/$3} To perform a substr in bash we use the following PE expression: ${fullpath//Rock/Roll} rolling it into "usr/home/JosephBaldwin/Its_only_Roll_and_Roll.mp3".
Line 44: Line 52:
=== Why aren't the PE things named more nicely ===
Line 45: Line 54:
=== Can't I just have these a regular functions with nice names? ===
Line 46: Line 56:
not totally generalizable

=== What can I do with PE's that I couldn't do with the string functions above? ===

Todo: offset code examples in code boxes as done in the rest of the wiki.

How do I do string manipulations in bash?

Bash can do string operations. LOTS of string operations. This is an introduction to bash string operations for those new to Bash's special tool/feature called Parameter Expansion (PE), with a focus on typical string operations. (Note: much of this material is in FAQ #73. It is being presented here with an approach inteneded to make it more accessable and more easily learned by people who have not had a lot of exposure to Bash.)

Note Bash's PE capability is a lot more powerful than the typical string manipulation calls you may be used to. There are some twists in the road up ahead. :)

Here is a list of some typical string manipulation functions/subroutines that you may already be familiar with:

  • strlen returns the length of the string
  • leftstr returns a string N chars long starting from the left hand side
  • rightstr returns a string N chars long starting from the right hand side
  • midstr returns a string N chars long starting from an offset K chars from the beginning/end
  • substr substitutes all instances of a pattern with a new string
  • basename returns the last component of a pathname (everything after the last "/")
  • dirname returns everything in the pathname up to, but not including the last "/"

Two that you haven't heard of but would want to use all the time when scripting on *NIX:

  • getext returns a filename's extension (eg. "txt", "mp3", "doc", "sxc", "html", etc. ... )
  • dropext returns the filename with the extension stripped off the end of the name.

This article will cover how to do all of these using the Bash and will introduce the more powerful actions available with Bash's PE's. Please note there is a BashFaq about PE's already. FAQ #73 covers a larger scope of PE capabilities, where this one focuses on string operations.

Filename manipulation

Lest say we have a bash variable named fullpath that contains "/usr/home/JosephBaldwin/Its_only_Rock_and_Roll.mp3"

Naturally in scripting we would want to manipulate certain pieces of the path, like just the file name, which is the last component of the full path. So lets get just the filename from the full path: In *NIX we have the command "basename" which does this very nicely for us: basename $fullpath returns "Its_only_Rock_and_Roll.mp3". In Bash we can do that much faster with this command: echo ${fullpath##*/}

"WHAT? What the heck is that? Thats not a command! Thats just a bunch of garbage someone made by wacking in some of the stranger keys on the keyboard! I mean really! dollar curly pound pound star slash curly What IS that? "

Um, OK - uh, just calm down for a moment. I know it doesn't look like the typical programming language keyword or library call, but consider a language like Perl. See? To shoehorn new features into Bash, you have to find ways to do it without creating keywords (or anything else) that might cause older scripts to break, so all these string manipulation functions got placed inside the syntax from an old sh feature where there just happened to be room for them. "Parameter expansion".

For a basename we use the PE expression: ${fullpath##*/} which returns "Its_only_Rock_and_Roll.mp3".

To find the dirname we use the PE expression: ${fullpath%/*} which produces "/usr/home/JosephBaldwin".

To drop the filename extesnion, we use the PE expression: ${fullpath%.*} giving out "/usr/home/JosephBaldwin/Its_only_Rock_and_Roll"

To get the filename's extension we use the PE expression: ${fullpath##*.} generating only "mp3".

To find the strlen the PE expression: ${#fullpath} finds it and its 49.

To get a leftstr, the PE expression: ${fullpath:0:20} grabs the first 20 chars of fullpath to make "usr/home/JosephBaldw".usr/home/JosephBaldwin/Its_only_Roll_and_Roll.mp3

To perform a rightstr in bash we use the following PE expression: ${fullpath:$(( 0 - 20 ))} which gets the last 20 chars, "ly_Rock_and_Roll.mp3".

To perform a midstr in bash we use the following PE expression: ${fullpath:10:20} making "osephBaldwin/Its_onl"

To perform a substr in bash we use the following PE expression: ${fullpath//Rock/Roll} rolling it into "usr/home/JosephBaldwin/Its_only_Roll_and_Roll.mp3".

Why aren't the PE things named more nicely

Can't I just have these a regular functions with nice names?

not totally generalizable

What can I do with PE's that I couldn't do with the string functions above?

Todo: offset code examples in code boxes as done in the rest of the wiki.


CategoryShell

BashFAQ/100 (last edited 2023-06-26 10:03:19 by StephaneChazelas)