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
所以我一直在使用以下通用语法来删除配置文件中“=”符号后一行的文本:
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