使用管道

时间:2015-09-14 19:06:32

标签: linux bash sed

我正在尝试转换文件,它可以有一行或多行,并提取单词“three”。示例文件是oneliner:

[test@test tmp]$ cat test1
onetwothreefourfive[pi@pidora tmp]$

我可以这样做:

[test@test tmp]$ sed -e 's/.*two\(.*\)four.*/\1/' test1
three[pi@pidora tmp]$

但我必须确保我的文件是oneliner,所以我正在使用这个问题的命令:How can I replace a newline (\n) using sed?

[test@test tmp]$ sed -e ':a;N;$!ba;s/\n/ /g' -e 's/.*two\(.*\)four.*/\1/' test1
onetwothreefourfive[pi@pidora tmp]$

它不起作用。

[test@test tmp]$ sed -e ':a;N;$!ba;s/\n/ /g' test1| sed -e 's/.*two\(.*\)four.*/\1/'
three[test@test tmp]$

我使用烟斗,它的工作原理。请向我解释为什么sed在没有管道的情况下工作错误。

谢谢!

2 个答案:

答案 0 :(得分:1)

N替换为$!N或使用括号:

sed ':a;$!{N;ba;};s/\n/ /g;s/.*two\(.*\)four.*/\1/' test1

回答你的下一个问题:我不知道为什么会这样。

答案 1 :(得分:0)

当你运行一个带有两个操作的sed命令时,它们都在原始文本上执行,因此你的第二个操作不会“看到”第一个添加的\ n。

当你用管道运行它时,第二个命令在第一个命令的输出上执行,所以第二个命令'看到'\ n的