用awk中的换行替换\ n

时间:2014-07-04 12:35:54

标签: bash 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与test.txt中的名字和姓氏之间的\n不匹配,而是与每行末尾的换行符匹配。

看起来\\n不是在终端中逃脱的正确方法吗?这种逃逸方式在例如Sublime Text:

regex working in ST3

6 个答案:

答案 0 :(得分:22)

这个怎么样?

$ cat file
John\nDoe
Sara\nConnor

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

答案 1 :(得分:7)

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

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

如果您输入的内容可能包含foo\\nbar这样的行,并且\\旨在成为转义反斜杠,那么您就无法使用像您要求的简单替换方法。< / p>

答案 2 :(得分:6)

使用GNU的sed,解决方案很简单,因为@ hek2mgl已经回答了(并且恕我直言,它应该在任何地方工作,但遗憾的是没有)。

但是在Mac OS Xother *BSD UNIXes上进行此操作时有点棘手。

最好的方式是这样的:

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

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

答案 3 :(得分:4)

为什么要使用awksed?使用perl

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

通过使用perl,您可以避免考虑posix合规性,并且通常会提供更好的性能,并且它将在所有(大多数)平台上保持一致。

答案 4 :(得分:1)

我会使用sed

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

答案 5 :(得分:0)

我之前一直在努力解决这个问题,但我发现最干净的方法是使用内置的 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 的字符串。