我试图转换文件,可以有一个或多个行,并提取单词“三”。示例文件是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没有管道就坏了。
谢谢!
发布于 2015-09-14 20:42:36
将N替换为$!N或使用括号:
sed ':a;$!{N;ba;};s/\n/ /g;s/.*two\(.*\)four.*/\1/' test1回答你的下一个问题:我不知道为什么会起作用。
发布于 2015-09-14 19:22:41
当您使用两个操作运行一个sed命令时,它们都将在原始文本上执行,因此您的第二个操作不会“查看”由第一个操作添加的\n。
当您使用管道运行它时,第二个命令将在第一个输出上执行,因此第二个命令“看到”\n的
https://stackoverflow.com/questions/32572096
复制相似问题