Home > Enterprise >  sed removing text after character not always working
sed removing text after character not always working

Time:06-03

So I have been using the following general syntax to be able to remove text on a line within a configuration file after the '=' sign:

sed -i 's|\(.*\txt_to_remove=\).*|\1|g' file.txt

Let's say I have a text file:

$ cat tmp.txt
datee='10'
alter='purple'
hr='green'
new_val='100'

and if I consecutively use the command I provided above to try and delete everything after '=':

sed -i 's|\(.*\datee=\).*|\1|g' tmp.txt
sed -i 's|\(.*\alter=\).*|\1|g' tmp.txt
sed -i 's|\(.*\hr=\).*|\1|g' tmp.txt
sed -i 's|\(.*\new_val=\).*|\1|g' tmp.txt

The results will be:

$ cat tmp.txt
datee=
alter='purple'
hr=
new_val='100'

The question is, why did the commands not work for the 'alter' or 'new_val', and what can be done to make sure that it always works for each individual instance of using the command?

CodePudding user response:

Do them all at once with:

sed -i 's/^\(\(datee\|alter\|hr\|new_val\)=\).*/\1/g' tmp.txt

CodePudding user response:

You have a backslash before the keyword that you want to replace. Backslash is the escape prefix, and \a and \n are escape sequences, so they don't match what's in the file.

Get rid of these backslashes.

sed -i 's|\(.*datee=\).*|\1|g' tmp.txt
sed -i 's|\(.*alter=\).*|\1|g' tmp.txt
sed -i 's|\(.*hr=\).*|\1|g' tmp.txt
sed -i 's|\(.*new_val=\).*|\1|g' tmp.txt

CodePudding user response:

try this sed expression sed 's/=.*//' I tried and got the desired results

cat tmp.txt | sed 's/=.*//'
datee
alter
hr
new_val
  • Related