使用 AWK 替换匹配行上的换行符

使用 AWK 替换匹配行上的换行符

我有以下数据

我想要做的是,对于每一行,如果末尾没有“555”,我想删除换行符 \n,并将其替换为空格。

因此,“匹配行”将是末尾没有“555”的行。我想替换这些行的换行符。

我的限制是不能使用 Perl 来完成这项工作。所以,只能使用 AWK 或 SED。但最好使用 AWK,因为我知道 SED 不太适合处理多行。

以下有 2 个示例:

示例 1

"abc","555"
"d
e
f","555"
"xyz","555"
"abc
d,e,f ghi
jkl
mnop,qrs","555"

应为(修订后)

"abc","555"
" d e f","555"
"xyz","555"
"abc d,e,f ghi jkl mnop,qrs","555"

&示例 2

"abc","555"
"d
e
f","555"
"xyz","555"
"aa
bb
cc
dd","555"

应为(修订后)

"abc","555"
"d e f","555"
"xyz","555"
"aa bb cc dd","555"

因此在需要的输出中,实际上每一行都有以下格式

"content","555"

答案1

在这种情况下,诀窍在于不要将其视为“在多条线路上工作”。

awk '/"555"$/ {print; next} {printf "%s ", $0}'

正常情况下,打印一组的最后一行,然后指示next继续下一个输入行(不处理剩余命令)。剩余命令(成为默认情况)打印当前行,后跟空格,不带换行符。也可以这样做

awk '{if ($0 ~ /"555"$/) print; else printf "%s ", $0}'

答案2

我不熟悉 AWK,但你可以分两步完成,首先将“555”\n 替换为你在文件中永远不会遇到的内容,例如“555555555555555555########################################4444444444444444444444444444444444”。然后将所有 \n 替换为空格

随后将奇怪的字符串替换为“555”\n

相关内容