![如何将长 sed 表达式分成多行?](https://linux22.com/image/40638/%E5%A6%82%E4%BD%95%E5%B0%86%E9%95%BF%20sed%20%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%88%86%E6%88%90%E5%A4%9A%E8%A1%8C%EF%BC%9F.png)
sed 's/[long1][long2]/[long3][long4]/' file.txt
我想将此命令拆分为多行 - fx 如下所示:
sed 's/
[long1]
[long2]
/
[long3]
[long4]
/' file.txt
使用\
或分隔字符串不起作用。
答案1
sed 's'/\
'[long1]'\
'[long2]'\
'/'\
'[long3]'\
'[long4]'\
'/' file.txt
如果新行不缩进,则用反斜杠分割多行确实有效。
$ echo "a,b" | sed 's/\(.'\
> '\),\(.\)/\2-\1/'
b-a
使用 GNU sed 4.2.2 在 Cygwin 上进行测试
答案2
另一个方面:
上述项目的可维护性如何[long]
?
您保留的子句越短、越清晰,随着时间的推移以及(sed-外部)事实围绕它们提供的功能发生变化,它们就越容易更改和增强。
例如
sed\ -e 's/[最小-s1]/[最小-r1]/' \ -e 's/[最小-s2]/[最小-r2]/' \ -e 's/[最小-s3]/[最小-r3]/' \ -e 's/[最小-s4]/[最小-r4]/'
...可能是值得努力和喜欢的事情。
答案3
您可以将长字符串保存到 bash 变量中,然后在sed
命令中使用:
string=[long1][long2]
replace=[long3][long4]
sed -e 's/'"$string"'/'"$replace"'/' file
如果你可以使用perl
,你可以用修饰符打破长模式x
:
perl -e 's/
[long1]
[long2]
/[long3][long4]/x' file
答案4
你也可以这样分解它:
sed '/[long1][long2]/
s//[long3][long4]/'
或者也许像:
sed "$(
printf 's/[%s][%s]/[%s][%s]/' \
long1 \
long2 \
long3 \
long4
)"
或者使用定界符:
sed -f - <<SED file.txt
s/\
[long1]\
[long2]\
/\
[long3]\
[long4]\
/
SED