linux 使用sed删除与整个字符串匹配的行

yv5phkfx  于 2023-08-03  发布在  Linux
关注(0)|答案(2)|浏览(170)

我有一个文件,我想删除与整个字符串匹配的行,使用sed。
我的文件test.txt的内容

test.pwd=test@123
test.pwd.path=/tmp/test
test.pwd1.sample=123

字符串
我尝试使用下面的sed命令,但它删除了与该模式匹配的行

sed -i "s/test.pwd/d" test.txt


不是只删除第1行而是删除前两行

6uxekuva

6uxekuva1#

如果非sed的答案是OK,那么perl将在=上分割行,并测试第一部分是否不等(避免正则表达式)

pattern='test.pwd'
perl -F= -slane 'print if $F[0] ne $patt' -- -patt="$pattern" test.txt

字符串
如果输出看起来像你想要的,添加-iperl -i -F= ...

1szpjjfi

1szpjjfi2#

记住你使用的是正则表达式元字符。sed -i "s/test.pwd/d" test.txt表示“删除任何包含test的行,然后 * 任何单个字符 *,然后pwd”。在你的文件里,所有你显示的行都匹配。
引用.,并添加一些不符合条件的行。作为
Paul Pazderski在他的第一个评论中建议,添加=可以做到这一点,尽管更具体更好。sed -i 's/^test[.]pwd=/d' test.txt只会从您的示例中删除预期的行。
如果把你的模式放在一个变量中,要小心引号和需要反斜杠的元字符,但是对于这个例子来说,它看起来很简单。

$: cat file
safe-line=seeMe
test.pwd=test@123
test-pwd=keepMe
test.pwd.path=/tmp/test
test.pwd1.sample=123

$: pat="test.pwd" # loses most lines
$: sed "/$pat/d" file
safe-line=seeMe

$: pat="test.pwd=" # still loses test-pwd
$: sed "/$pat/d" file
safe-line=seeMe
test.pwd.path=/tmp/test
test.pwd1.sample=123

$: pat=^test\.pwd= # unquoted string, literal dot - still loses test-pwd 
$: sed "/$pat/d" file
safe-line=seeMe
test.pwd.path=/tmp/test
test.pwd1.sample=123

$: pat="^test\.pwd=" # works, but some may wonder - why not \\ ?
$: sed "/$pat/d" file
safe-line=seeMe
test-pwd=keepMe
test.pwd.path=/tmp/test
test.pwd1.sample=123

$: pat="^test[.]pwd=" # works, and clear
$: sed "/$pat/d" file
safe-line=seeMe
test-pwd=keepMe
test.pwd.path=/tmp/test
test.pwd1.sample=123

字符串

相关问题