2014-07-04 220 views
5

我在拖尾日志中输出\n而不是换行符。在awk中用换行符替换 n

我想我会把tail管到awk并做一个简单的替换,但我似乎无法逃避正则表达式中的换行符。在这里,我展示了我的问题的cat代替tail

// test.txt 
John\nDoe 
Sara\nConnor 

cat test.txt | awk -F'\\n' '{ print $1 "\n" $2 }' 

所需的输出:

John 
Doe 
Sara 
Connor 

实际输出:

John\nDoe 
     <- there is a newline here 
Sara\nConnor 
     <- there is a newline here  

所以看起来\\n不匹配\n在test.txt中的名字和姓氏之间,而是在每行末尾的换行符。

看起来好像\\n不是在终端右转逃的正确方法吗?这种逃避方式在例如崇高文字:

regex working in ST3

回答

12

这个怎么样?

$ cat file 
John\nDoe 
Sara\nConnor 

$ awk '{gsub(/\\n/,"\n")}1' file 
John 
Doe 
Sara 
Connor 
+0

为什么你使用'awk'? 'sed'似乎更适合*编辑*文件。 – hek2mgl

+4

op标记了awk标记。 –

+1

你可以用'RS'改变''\ n“'并得到'awk'{gsub(/ \\ n /,RS)}'' – Jotne

1

我会用sed

sed 's/\\n/\n/g' file 
+0

这对我不起作用:'sed's/\\ n/\ n/g'test.txt'输出:line1:'JohnnDoe' line2:'SaranConnor' – Cotten

+0

它应该。尝试:'sed's/\\ n/\ n/g'<<<'ABC \ n123'' – hek2mgl

+0

'sed's/\\ n/\ n/g'<<<'ABC \ n123''给出我'ABCn123'。这是一个平台问题吗?我在OS X上使用zsh – Cotten

6

使用GNU的sed,解决的办法是为@ hek2mgl已经回答非常简单(和恕我直言,是它应该无处不在的工作方式,但遗憾的是没有)。

但是在Mac OS Xother *BSD UNIXes上做这件事有点棘手。

,最好的办法是这样的:

sed 's/\\n/\'$'\n''/g' <<< 'ABC\n123' 

然后,当然还是有AWK,@AvinashRaj具有正确的答案,如果你想使用它。

+0

这意味着BSD'sed'不是POSIX兼容的。 – hek2mgl

+1

错误,没有。反过来说:GNU的'sed'扩展了POSIX'sed';这就是为什么它首先需要'--posix'。 – DarkDust

+0

当然可以,但代码使用'--posix'和GNU sed – hek2mgl

7

这将与任何sed的任何系统上工作,因为它是在使用新行便携式方式的sed:

$ sed 's/\\n/\ 
/' file 
John 
Doe 
Sara 
Connor 

如果有可能你输入包含这样一行foo\\nbar\\意作为一个逃脱的反斜杠,那么你不能像你所要求的那样使用简单的替换方法。

+1

是的,你是对的。你能否解释为什么'GNU sed --posix'的行为与BSD sed不同(它也声称是POSIX兼容)。 “GNU sed --posix”无法正常工作或者BSD sed不兼容POSIX会导致问题出在哪里? – hek2mgl

+0

对不起,我需要阅读sed的POSIX规范来确定这一点,并且寿命太短......但我会说,BSD awk在某些方面被破坏了(例如,解析未被分割的三元表达式打印语句)所以也许他们的sed也是? –

+1

我也需要,也许你知道它已经... :) thx。 +1为解决方案 – hek2mgl

3

为什么要使用awksed这个?使用perl

perl -pe 's/\\n/\n/g' file 

使用perl,您就不必去想符合POSIX,它通常会提供更好的性能,它会在所有(最)平台上是一致的。