我正在尝试转换文件,它可以有一行或多行,并提取单词“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在没有管道的情况下工作错误。
谢谢!
答案 0 :(得分:1)
将N
替换为$!N
或使用括号:
sed ':a;$!{N;ba;};s/\n/ /g;s/.*two\(.*\)four.*/\1/' test1
回答你的下一个问题:我不知道为什么会这样。
答案 1 :(得分:0)
当你运行一个带有两个操作的sed命令时,它们都在原始文本上执行,因此你的第二个操作不会“看到”第一个添加的\ n。
当你用管道运行它时,第二个命令在第一个命令的输出上执行,所以第二个命令'看到'\ n的