如何将长sed表达式分成多行?


15
sed 's/[long1][long2]/[long3][long4]/' file.txt

我想将此命令拆分为多行-fx如下所示:

sed 's/
    [long1]
    [long2]
  /
    [long3]
    [long4]
  /' file.txt

使用\或分隔字符串无效。



这就是为什么Perl具有/x替换修饰符的原因。
choroba 2014年

1
@Networker:是的,谢谢,我也在那儿添加了我的答案
Raffael

Answers:


8

您可以将长字符串保存到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

1
为什么使用这么多的报价?sed "s/$string/$replace/" file.txt很好
斯科特

1
另外,当然,您需要删除之后的空格replace=
斯科特

8
sed 's'/\
'[long1]'\
'[long2]'\
'/'\
'[long3]'\
'[long4]'\
'/' file.txt

如果未缩进新行,则使用反斜杠在多行中拆分确实有效。

$ echo "a,b" | sed 's/\(.'\
> '\),\(.\)/\2-\1/'
b-a

使用GNU sed 4.2.2在Cygwin上测试


您的sed版本是什么?我测试了GNU sed version 4.2.1,但不起作用。
cuonglm

2
看起来在第一行末尾缺少反斜杠吗?
Volker Siegel

7

另一个方面:

[long]以上各项的维护性如何?

您可以保留这些子句的时间越短,越清晰,随着时间的流逝以及(sed-external)事实在它们提供的功能周围发生变化,它们将更容易更改和增强。

例如

sed
-e's / [最小-s1] / [最小-r1] /'\
-e's / [最小-s2] / [最小-r2] /'\
-e's / [minimal-s3] / [minimal-r3] /'\
-e's / [minimal-s4] / [minimal-r4] /' 

...可能是要争取和喜欢的东西。


4

您还可以通过以下方式将其分解:

sed '/[long1][long2]/
    s//[long3][long4]/'

也许像:

sed "$(
    printf 's/[%s][%s]/[%s][%s]/' \
        long1 \
        long2 \
        long3 \
        long4
)"

或使用Heredoc:

sed -f - <<SED file.txt
s/\
[long1]\
[long2]\
/\
[long3]\
[long4]\
/
SED
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.