Hasan
Hasan

Reputation: 169

Remove ^H and ^M characters from a file using Linux shell scripting

How do I remove ^H and ^M characters from a file using Linux shell scripting?

^[[0^H ^H^H ^H^H ^H^H ^H^H ^H^H ^H^H ^H^H ^H   rcv-packets: 0
^[[0^H ^H^H ^H^H ^H^H ^H^H ^H^H ^H^H ^H^H ^H      rcv-errs: 0
     rcv-drop: 0
     rcv-fifo: 0
     rcv-frame: 0

Upvotes: 16

Views: 31590

Answers (7)

Fariman Kashani
Fariman Kashani

Reputation: 1024

I used dos2unix and it worked for me.

If you are using a Debian-based distro, you should be able to do sudo apt-get install dos2unix.

If you are using a RH-like distro, you should be able to do sudo yum install dos2unix.

Once it is installed, you can just give the target file as an argument

dos2unix file.sh

Upvotes: 0

xiaweiss
xiaweiss

Reputation: 1

if you want to change original file, do this:

sed -i '.bak' 's/^M//g ; s/^H//g' test.md

(^M is control+v control+m)
(^H is control+v control+h)

much file, you can do this:

find source -name '*.md' | xargs sed -i '.bak' 's/^M//g ; s/^H//g'

Upvotes: 0

kenorb
kenorb

Reputation: 166737

You can remove all control characters by using tr, e.g.

tr -d "[:cntrl:]" file.txt

To exclude some of them (like line endings), check: Removing control characters from a file.

Upvotes: 0

Sergey
Sergey

Reputation: 769

Use sed utility. See below as per examples:

sed 's/%//' file > newfile
echo "82%%%" | sed 's/%*$//'
echo "68%" | sed "s/%$//" #assume % is always at the end.

Upvotes: 0

subbu
subbu

Reputation: 489

For removing ^M characters appearing at the end of every line, I usually do this in vi editor.

:%s/.$//g

It just removes the last character of every line irrespective of what the character is. This solved my provlem.

Upvotes: 2

Patrick J. S.
Patrick J. S.

Reputation: 2935

What you're seeing there are control characters, you simply could delete them with tr

cat your_file |
tr -d '\b\r'

this is better:

tr -d '\b\r' < your_file

Upvotes: 26

sarnold
sarnold

Reputation: 104080

Two methods come to mind immediately:

  • tr -d control+v control+h
  • sed 's/control+v control+h//g'

Here's both in action:

$ od -c test
0000000  \b   h   e   l   l   o  \b   t   h   e   r   e  \b  \n
0000016
$ sed 's/^H//g' < test | od -c
0000000   h   e   l   l   o   t   h   e   r   e  \n
0000013
$ tr -d ^H < test | od -c
0000000   h   e   l   l   o   t   h   e   r   e  \n
0000013

Upvotes: 9

Related Questions