sed 在字符后删除文本并不总是有效

sed removing text after character not always working

所以我一直在使用以下通用语法来删除配置文件中“=”符号后一行的文本:

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

假设我有一个文本文件:

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

如果我连续使用上面提供的命令尝试删除“=”之后的所有内容:

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

结果将是:

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

问题是,为什么这些命令对 'alter' 或 'new_val' 不起作用,如何才能确保它始终对使用该命令的每个单独实例起作用?

试试这个 sed 表达式 sed 's/=.*//' 我尝试并得到了想要的结果

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

您要替换的关键字前有一个反斜杠。反斜杠是转义前缀,\a\n 是转义序列,因此它们与文件中的内容不匹配。

去掉这些反斜杠。

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

一次性全部完成:

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