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

Raf*_*ael 22 sed

sed 's/[long1][long2]/[long3][long4]/' file.txt
Run Code Online (Sandbox Code Playgroud)

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

sed 's/
    [long1]
    [long2]
  /
    [long3]
    [long4]
  /' file.txt
Run Code Online (Sandbox Code Playgroud)

使用\或分隔字符串不起作用。

Raf*_*ael 14

sed 's'/\
'[long1]'\
'[long2]'\
'/'\
'[long3]'\
'[long4]'\
'/' file.txt
Run Code Online (Sandbox Code Playgroud)

如果新行不缩进,用反斜杠拆分多行确实有效。

$ echo "a,b" | sed 's/\(.'\
> '\),\(.\)/\2-\1/'
b-a
Run Code Online (Sandbox Code Playgroud)

使用 GNU sed 4.2.2 在 Cygwin 上测试


Han*_*nnu 11

另一个方面:

上述[long]项目的可维护性如何?

您可以保留条款越短和越明确,随着时间的推移和(sed-external)事实围绕它们提供的功能发生变化,它们就越容易改变和增强。

例如

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

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


cuo*_*glm 8

您可以将长字符串保存到 bash 变量,然后在sed命令中使用:

string=[long1][long2]
replace=[long3][long4]
sed -e 's/'"$string"'/'"$replace"'/' file
Run Code Online (Sandbox Code Playgroud)

如果可以使用perl,则可以使用x修饰符打破长模式:

perl -e 's/
[long1]
[long2]
/[long3][long4]/x' file
Run Code Online (Sandbox Code Playgroud)

  • 你为什么用这么多引号?`sed "s/$string/$replace/" file.txt` 很好。 (2认同)

mik*_*erv 6

你也可以这样分解:

sed '/[long1][long2]/
    s//[long3][long4]/'
Run Code Online (Sandbox Code Playgroud)

或者可能像:

sed "$(
    printf 's/[%s][%s]/[%s][%s]/' \
        long1 \
        long2 \
        long3 \
        long4
)"
Run Code Online (Sandbox Code Playgroud)

或者使用heredoc:

sed -f - <<SED file.txt
s/\
[long1]\
[long2]\
/\
[long3]\
[long4]\
/
SED
Run Code Online (Sandbox Code Playgroud)