≡ Menu

Linux / Unix sed: Delete Word From File / Input

I‘ve a file as follows:

This is a test.
One bang two three
Foo dang Bar
001 0xfg 0xA
002 0xA foo bar 0xfG
I'm done


How do I delete all “words” from the above file which ends with a particular letter (say ‘g’) in each line? The output should be as follows:

This is a test.
One two three
Foo Bar
001 0xA
002 0xA foo bar
I'm done

How do I delete regex-based word using sed or awk under Linux / Unix like operating systems?

You can use any standard Unix text editing and processing utility to find and replace/delete words from the file.

Sed example

The syntax is:

sed 's/\<word\>//g' input
sed -e 's/\<regex-for-word\>//g' input > output

In this example, delete foo word from input:

echo 'This is a foo test' | sed -e 's/\<foo\>//g'

To delete all words ending with a letter ‘g’ in each line, enter:

sed -e 's/\<[a-zA-Z0-9]*[g|G]\>//g' input

Awk example

The syntax is:

awk '{gsub("word", "");print}' input
awk '{gsub("regex", "");print}' input > output

In this example, delete bar word from input:

awk '{gsub("bar", "");print}' <<< "This is a bar test"

To delete all words ending with a letter ‘g’ in each line using gnu/awk, enter:

awk '{gsub("[a-zA-Z0-9]*[g|G]$", "");print}' input

Or

awk '{gsub("\\<[a-zA-Z0-9]*[g|G]\\>", "");print}' input
Share this tutorial on:

{ 10 comments… add one }
  • Chris F.A. Johnson September 15, 2012, 3:46 am

    The awk examples do not do what they are supposed to do; they delete all matching strings, not matching words.

    echo 'Tough
    thing
    rough' | awk '{gsub("[a-zA-Z0-9]*[g|G]", "");print}'
    h
    h
    

    Tough and rough do not end in ‘g’

    • nixCraft September 15, 2012, 5:33 am
      echo 'Tough
      thing
      rough' | awk '{gsub("[a-zA-Z0-9]*[g|G]$", "");print}'
      

      Yes, $ missing at the end of regex. The faq has been updated. Thanks for the head up.

  • Jalal Hajigholamali September 15, 2012, 4:55 am

    Hi,
    Very useful article.
    Thanks a lot…

  • Logicos September 15, 2012, 9:24 pm
    sed 's/[^ ]*g//gi' input
    This is a test.
    One  two three
    Foo  Bar
    001  0xA
    002 0xA foo bar
    I'm done
    
    • nixCraft September 16, 2012, 4:45 am

      Thanks for sharing the nifty regex :)

  • Abdul Kadir October 4, 2012, 10:24 am

    Thanks a lots…….

  • Holley November 9, 2014, 11:52 am

    Interesting article, I think it’s likely to prove helpful in the long run with my work.

  • w4rb0y February 7, 2016, 9:39 am

    #cat test.txt
    One two three
    Foo Bar
    001 0xA
    002 0xA foo bar
    I’m done

    #cat test.txt | sed ‘s/[^[:blank:]]*[gG][^[:blank:]]*//g’

    One two three
    Foo Bar
    001 0xA
    002 0xA foo bar
    I’m done

    • w4rb0y February 7, 2016, 5:02 pm

      ****** Correction to my above mistake******

      #cat test.txt

      This is a test.
      One bang two three
      Foo dang Bar
      001 0xfg 0xA
      002 0xA foo bar 0xfG
      I’m done

      #cat test.txt | sed ‘s/[^[:blank:]]*[gG][^[:blank:]]*//g’

      One two three
      Foo Bar
      001 0xA
      002 0xA foo bar
      I’m done

  • DodoGTA February 27, 2016, 4:18 pm

    Thanks! (I needed to add in-place editing for my case in sed example, however)

Leave a Comment


   Tagged with: , , ,