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

如何将长 sed 表达式分成多行?
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

相关内容