字符串是“>ABCD EFG;” 。我想通过shell命令“sed”将
>, ,;,
更改为_,;,!
,该怎么做?
我尝试,
echo ">ABCD EFG;" |sed 's#>(.*) (.*);$#_$1;$2!#g'
结果是>ABCD EFG;
$1 和 $2 是错误的吗?
没用!
Sed 默认使用基本正则表达式(BRE)。这意味着您需要转义某些字符。
这个
>(.*) (.*);$
正则表达式可以使用扩展正则表达式(ERE、-E
)来工作,但使用 BRE 时看起来就像 >\(.*\) \(.*\);$
。
其次,替换语法使用
\
而不是 $
(来自 sed 的手册页):
替换可能包含特殊字符 & 来引用模式空间中匹配的部分,并通过 \9 进行特殊转义来引用正则表达式中相应的匹配子表达式。
因此,使用 BRE 的 sed 命令应该如下所示(请注意,命令
g
不是强制性的,因为在您的示例中,您需要每行进行一次此修改):
sed 's/>\(.*\) \(.*\);$/_\1;\2!/'
我想把 >, ,;, 改为 _,;,!
为什么不使用
tr
,例如:
<<<">ABCD EFG;" tr '> ;' '_;!'
输出:
_ABCD;EFG!
当您想使用
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;"|
。