使用`sed`多次没有管道

the*_*eta 3 sed

例:

echo one two three | sed 's/ /\n/g' | sed 's/^/:/g'
Run Code Online (Sandbox Code Playgroud)

输出:

:一
:二
:三

没有管道:

echo one two three | sed 's/ /\n/g;s/^/:/g'
Run Code Online (Sandbox Code Playgroud)

输出:

:一个
2
3

似乎第一个模式在执行第二个模式之前没有扩展,但我真的不太了解sed

如何在没有管道两次的情况下使用第一个示例

示例中使用的PS模式是提供信息的

Jon*_*ler 8

另一种方法是重复-e选项:

echo one two three | sed -e 's/ /\n:/g' -e 's/^/:/g'
Run Code Online (Sandbox Code Playgroud)

当你有许多操作要做时,这更容易理解; 您可以在单独的行上对齐单独的操作:

echo one two three |
sed -e 's/ /\n:/g' \
    -e 's/^/:/g'
Run Code Online (Sandbox Code Playgroud)

例如,我有一个脚本来从模板生成大纲文档.该脚本的一部分包含:

sed -e "s/[:]YEAR:/$(date +%Y)/g" \
    -e "s/[:]TODAY:/$today/" \
    -e "s/[:]BASE:/$BASE/g" \
    -e "s/[:]base:/$base/g" \
    -e "s/[:]FILE:/$FILE/g" \
    -e "s/[:]file:/$file/g" \
    $skeleton |
...
Run Code Online (Sandbox Code Playgroud)

虽然它可以在一行上完成,但它不会提高可读性.


Gre*_*Cat 2

这里的主要问题是 sed 在执行任何命令之前决定行的构成(它所作用的模式)。也就是说,如果只有一个模式 ( one two three),则在执行 后它不会被重新解释为多行s/ /\n/g。If 仍然是单个模式,尽管它内部包含换行符。

让 sed 沿着新插入的换行符重新解释模式的最简单的解决方法就是像您一样运行 sed 两次。

另一个解决方法是m向命令添加类似选项(多行缓冲区)的内容s

$ echo one two three | sed 's/ /\n/g;s/^/:/mg'
:one
:two
:three
Run Code Online (Sandbox Code Playgroud)