我有一个包含许多行的文件,出于简化的目的,看起来很像这样。
aaaxxx
xxxbbb
xxx
aaaxxxbbb
bbbxxxaaa
aaa
bbb
每当我尝试提出一个仅过滤掉“xxx”行的sed命令时,所有其他行都会以某种方式过滤掉。也许我正在使用sed错误,或者还有另一个命令来执行此操作。
这个想法是一个sed命令,只删除xxx行,但不包含xxx行。
我可以编写一个命令来删除cli中的xxx行,但是我需要在一个从用户那里获取输入变量的脚本中按需重复执行。
这是我最新的“不工作”版本:
read var
sed -i -e '/^$var$/d'
答案 0 :(得分:3)
在我看来,awk是比sed或grep更好的解决方案,因为它可以将模式视为字符串,而不是正则表达式。
awk -v x="$var" '$0!=x' file
答案 1 :(得分:2)
sed '/^xxx$/d' File
或
sed -i.bak '/^xxx$/d' File => this edits the file in place, keeping a backup.
仅删除包含xxx
^ => beginning of line
,$ => end of line
)
<强>示例:强>
AMD$ cat File
aaaxxx
xxxbbb
xxx
aaaxxxbbb
bbbxxxaaa
aaa
bbb
AMD$ sed '/^xxx$/d' File
aaaxxx
xxxbbb
aaaxxxbbb
bbbxxxaaa
aaa
bbb
修改强> 如果使用变量,请使用:
read var
sed -i "/^$var$/d" File
答案 2 :(得分:2)
如果您尝试从文件中删除与给定字符串完全匹配的所有行,则可以使用grep:
grep -vFx "$match" "$file"
grep选项:
-v Invert the match. Print lines which don't match.
-F The match is an exact string, not a regular expression
-x The match must match an entire line (except for the newline)
示例:
$ cat file
aaaxxx
xxxbbb
xxx
aaaxxxbbb
bbbxxxaaa
aaa
bbb
$ match=xxx
$ grep -vFx "$match" file
aaaxxx
xxxbbb
aaaxxxbbb
bbbxxxaaa
aaa
bbb