shell 如何在sed的/(.*)/?/g '中保留字符串,?是什么?

58wvjzkj  于 6个月前  发布在  Shell
关注(0)|答案(3)|浏览(59)

字符串是“>ABCD EFG;”.我想通过shell命令“sed”将>, ,;,更改为_,;,!,怎么办?
我试了,echo ">ABCD EFG;" |sed 's#>(.*) (.*);$#_$1;$2!#g',结果是>ABCD EFG; $1和$2是错误的?没用!

bfrts1fy

bfrts1fy1#

默认情况下,Sed使用基本正则表达式(BRE)。这意味着你需要转义一些字符。
这个>(.*) (.*);$正则表达式可以使用扩展正则表达式(ERE,-E),但看起来像使用BRE的>\(.*\) \(.*\);$
其次,替换语法使用\而不是$(来自sed的手册页):
替换可以包含特殊字符&来引用匹配的模式空间部分,以及特殊转义符\1到\9来引用正则表达式中相应的匹配子表达式。
因此,使用BRE的sed命令应该如下所示(注意,命令g不是强制性的,因为在您的示例中,您需要每行修改一次):

sed 's/>\(.*\) \(.*\);$/_\1;\2!/'

字符串

tzxcd3kk

tzxcd3kk2#

我想把>,,;,改成_,;,!
为什么不使用tr,例如:

<<<">ABCD EFG;" tr '> ;' '_;!'

字符串
输出量:

_ABCD;EFG!

vmdwslir

vmdwslir3#

当您想要使用sed时,可以在以下命令之间进行选择,

# Use \1 en \2 to paste remembered strings
echo ">ABCD EFG;"|  sed -E 's/>(.*) (.*);/_\1;\2!/'

# Replace characters anywhere in the string
# Since you are replacing in 3 steps, replace the ' ' at the end.
echo ">ABCD EFG;"|  sed -E 's/>/_/g; s/;/!/g; s/ /;/g'

# Special y operator
echo ">ABCD EFG;"|  sed 'y/> ;/_;!/'

字符串
你不经常在sed中看到'y'运算符,因为tr命令做得很好。@Thor在他的回答中展示了这一点,其中<<<">ABCD EFG;"是写echo ">ABCD EFG;"|的有效方法。

相关问题