Regex 如何使sed删除替换不匹配的行

Regex 如何使sed删除替换不匹配的行,regex,sed,substitution,Regex,Sed,Substitution,我基本上想这样做: cat file | grep '<expression>' | sed 's/<expression>/<replacement>/g' cat文件| grep'| sed's///g' 不必写两次表达式: cat file | sed 's/<expression>/<replacement>/g' cat文件| sed's///g' 有没有办法告诉sed不要打印与替换命令中的正则表达式不匹配的行?如何:

我基本上想这样做:

cat file | grep '<expression>' | sed 's/<expression>/<replacement>/g'
cat文件| grep'| sed's///g'
不必写两次表达式:

cat file | sed 's/<expression>/<replacement>/g'
cat文件| sed's///g'
有没有办法告诉sed不要打印与替换命令中的正则表达式不匹配的行?

如何:

cat file | sed 'd/<expression>/'
cat文件| sed'd/'
将从输入中删除匹配的模式。当然,这和你想要的正好相反,但是也许你可以做一个相反的正则表达式

请不要说我对语法不是很清楚,只是在不久前才用过几次。

cat file | sed-n'/{s///g;p;}
cat file | sed -n '/<expression>/{s//<replacement>/g;p;}'

这可能适合您:

sed '/<expression>/!d;s//<replacement>/g' file
sed'//!Ds///g'文件

sed的///gp;d'文件

假设您有一个包含要替换的文本的文件

$ cat new.text 
A
B
如果您想将A更改为A,那么理想情况下,我们将执行以下操作-

$ sed 's/A/a/' new.text 
a
B
但是如果你不想得到不受替换影响的线,那么你可以使用n和p的组合,如下所示-

$ sed -n 's/A/a/p' new.text 
a

+1,但请注意“…g;p;}”是非标准的,不能在所有sed中使用。此外,UUOC@Williampersell是否愿意详细说明其中哪一部分是非标准的<代码>…g;p} 只适用于gnu sed,但据我所知,我在回答中的方式是标准的。sed的某些版本不允许使用“;”分隔命令,但需要实际回车符。那些版本的sed使用起来非常烦人;)@williampersell很好,根据,用
分隔命令
是标准的:
除{、a、b、c、i、r、t、w、:、和#之外的命令动词可以后跟分号、可选的s和另一个命令动词。但是,当s命令动词与w标志一起使用时,以这种方式跟在它后面的另一个命令会产生未定义的结果。
,因此那些“其他”命令动词sed实现已中断:)使用-n选项(如
sed-n
)抑制输出,并使用p选项(如
/g;p
中的g旁边)仅打印发生更改的行。您好,Ropez,为了更好地格式化,我已将响应放在应答部分。“cat文件”这只是一个例子,在实际用例中,输入来自git命令。新的赢家!之所以选择它,是因为它比其他选项更容易记住。
$ sed -n 's/A/a/p' new.text 
a