Bash Remove Last Character From String / Line / Word

by on April 26, 2011 · 8 comments· LAST UPDATED April 12, 2014

in , ,

I have a file of that looks as follows:

foo bar
tom jerry
UNIX Linux

Each word and/or Linux is a different length. How do strip or remove the last character from each line using bash or ksh shell only on a Linux or Unix-like systems?

Tutorial details
DifficultyEasy (rss)
Root privilegesNo
RequirementsNone
Estimated completion time2m


You can use any one of the following commands:

  • Bash/ksh shell substitution
  • cut command
  • head command
  • tail command

Bash/ksh shell substitution example

The syntax to remove last character from line or word is as follows:

x="foo bar"
echo "${x%?}"

Sample outputs:

foo ba

The % is bash parameter substitution operators which remove from shortest rear (end) pattern. You can use the bash while loop as follows:

 
#!/bin/bash
while IFS= read -r line
do
       echo "${line%?}"
       # or put updated line to a new file
       #echo "${line%?}" >> /tmp/newfile
done < "/path/to/file"
 

cut command example

The syntax is as follows:

## if length of STRING is 3, pass 2 as  character positions 
echo "foo"| cut -c 1-2
## if length of STRING is 14, pass 13 as character positions 
echo "nixCraft Linux" | cut -c 1-13
 
See also:

# Additional correction by James K; Editing by VG - log #

TwitterFacebookGoogle+PDF versionFound an error/typo on this page? Help us!

{ 8 comments… read them below or add one }

1 punktyras April 27, 2011 at 2:15 pm

whiile IFS= read -r line

whiile -> while

Reply

2 null May 11, 2011 at 7:55 am

Did you ever heard of “wc -l”? Or “head”/”tail” commands?

Reply

3 Keilaron November 19, 2011 at 8:25 pm

Although a bit rude, the previous comment has a point: You can use head and tail to strip off characters. If you want it to be the first X or last X, you can use -/+, like so:

echo '"foo!"'

“foo!”

echo '"foo!"' | head -c -2

foo!”

echo '"foo!"' | tail -c +2

“foo!

echo '"foo!"' | head -c -2 | tail -c +2

foo!
This is particularly useful with tree -Q (it doesn’t escape properly otherwise).

Reply

4 Seshadri June 3, 2013 at 1:24 am

Excellent, Keilaron !

Just noticed a typo in your post (transposed cut paste):

echo '"foo!"' | head -c -2
“foo!

echo '"foo!"' | tail -c +2
foo!”

Reply

5 NightFlight March 19, 2014 at 4:23 pm

echo ‘”foo!”‘ | head -c -2
head: illegal byte count — -2

Reply

6 Keilaron March 23, 2014 at 10:19 pm

Odd, I just updated and it still works for me.
What do you get from head –version (which distro/OS, too)? I get head (GNU coreutils) 8.21 Packaged by Gentoo (8.21 (p1.0))…

Reply

7 Nix Craft April 12, 2014 at 6:33 am

Mostly head/tail command on *BSD/OSX and older Unix-like oses will not accept GNU/{head|tail} syntax.

Reply

8 Keilaron April 16, 2014 at 6:05 pm

Oh, good point. I even have an old Mac here I could have tested on, but I didn’t think of it. I was just thinking of Linux at the time.. and yeah, the GNU/Linux tools tend to have little quirks and additions.

Reply

Leave a Comment

Tagged as: , , , , , , , , ,

Previous Faq:

Next Faq: