替换“ " awk 中带有换行符

问题描述 投票:0回答:8

我跟踪日志,它们输出

\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

Sara\nConnor

所以看起来

\\n
与 test.txt 中名字和姓氏之间的
\n
不匹配,而是每行末尾的换行符。

看起来

\\n
不是在终端中逃脱的正确方法,对吧?这种转义方式在例如崇高的文字:

regex working in ST3

bash awk
8个回答
55
投票

这个怎么样?

$ cat file
John\nDoe
Sara\nConnor

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

15
投票

使用 GNU 的

sed
,解决方案非常简单,因为 @hek2mgl 已经回答了(恕我直言,它应该在任何地方都有效,但不幸的是并非如此)。

但是在 Mac OS X其他 *BSD UNIXes 上执行此操作有点棘手。

最好的方法是这样的:

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

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


10
投票

为什么要使用

awk
sed
来实现此目的? 使用
perl

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

通过使用

perl
,您无需考虑 posix 合规性,它通常会提供更好的性能,并且在所有(大多数)平台上保持一致。


9
投票

这适用于任何系统上的任何 sed,因为它是在 sed 中使用换行符的可移植方式:

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

如果您的输入可能包含像

foo\\nbar
这样的行,并且
\\
旨在成为转义反斜杠,那么您不能使用您所要求的简单替换方法。


8
投票

我以前曾遇到过这个问题,但我发现最干净的方法是使用内置的

printf

printf "$(cat file.txt)" | less

这是一个处理 aws iam 在输出中嵌入 json 策略的真实示例,文件 file.txt 包含:

{
  "registryId": "111122223333",
  "repositoryName": "awesome-repo",
  "policyText": "{\n  \"Version\" : \"2008-10-17\",\n  \"Statement\" : [ {\n    \"Sid\" : \"AllowPushPull\",\n    \"Effect\" : \"Allow\",\n    \"Principal\" : {\n      \"AWS\" : [ \"arn:aws:iam::444455556666:root\", \"arn:aws:iam::444455556666:user/johndoe\" ]\n    },\n    \"Action\" : [ \"ecr:BatchCheckLayerAvailability\", \"ecr:BatchGetImage\", \"ecr:CompleteLayerUpload\", \"ecr:DescribeImages\", \"ecr:DescribeRepositories\", \"ecr:GetDownloadUrlForLayer\", \"ecr:InitiateLayerUpload\", \"ecr:PutImage\", \"ecr:UploadLayerPart\" ]\n  } ]\n}"
}

应用上述内容(没有较少的内容)后,您将得到:

{
  "registryId": "111122223333",
  "repositoryName": "awesome-repo",
  "policyText": "{
  "Version" : "2008-10-17",
  "Statement" : [ {
    "Sid" : "AllowPushPull",
    "Effect" : "Allow",
    "Principal" : {
      "AWS" : [ "arn:aws:iam::444455556666:root", "arn:aws:iam::444455556666:user/johndoe" ]
    },
    "Action" : [ "ecr:BatchCheckLayerAvailability", "ecr:BatchGetImage", "ecr:CompleteLayerUpload", "ecr:DescribeImages", "ecr:DescribeRepositories", "ecr:GetDownloadUrlForLayer", "ecr:InitiateLayerUpload", "ecr:PutImage", "ecr:UploadLayerPart" ]
  } ]
}"
}

请注意,“policyText”的值本身就是一个包含 json 的字符串。


4
投票

我会用

sed

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

1
投票

除了已接受的答案之外,OP还询问了tail,并且在某些unix变体上,例如ubuntu,您需要向awk添加-W交互

tail -f error.log | awk -W interactive '{gsub(/\\n/,"\n")}1'

0
投票
cat test.txt | tr " " "\\n"
© www.soinside.com 2019 - 2024. All rights reserved.