在Shell脚本中,每当遇到逗号时,在文件中插入换行符

8
我需要编写一个shell脚本以插入换行符重新格式化文件。条件是在文件中遇到逗号时应插入换行符。
例如,如果文件delimiter.txt包含:

this, is a file, that should, be added, with a, line break, when we find, a comma.

输出应该是:
this
is a file
that should
be added
with a
line break
when we find a
a comma.

这能用grepawk实现吗?

我很好奇你为什么认为grep可能是这项工作的合适工具。grep的名称源自于g/re/p,这些是搜索RE并打印匹配行的ed命令。这就是grep的全部用途 - 搜索RE并打印结果,它不是一个编辑器。 - Ed Morton
4个回答

9

使用GNU sed:

sed 's/, /\n/g' your.file

输出:

this
is a file
that should
be added
with a
line break
when we find a
a comma. 

注意:上述语法只适用于将\n作为行分隔符的Linux和大多数Unix系统。
如果您需要在脚本中使用门户解决方案,则使用以下表达式,该表达式使用文字换行符而不是\n
sed 's/,[[:space:]]/\
/g' your.file

感谢 @EdMorten 的建议。

我认为应该是 sed 's/, /\\n/g' file_name - TheBatmanWhoLaughs
你使用的sed版本是什么?我正在使用GNU版本。 - hek2mgl
在sed脚本中使用\n是不可移植的,可移植的方法是使用反斜杠后跟一个字面换行符,这样你的脚本就分成了两行,第一行是sed 's/, /<backslash>,第二行是/g' file_name。你还应该将, 更改为,[[:space:]]*或等效形式。 - Ed Morton
1
在第二个中,你需要在那个换行符前加上反斜杠。 - Kevin

6
这就是 tr 的用途。
$ tr ',' '\n' <<< 'this, is a file, that should, be added, with a, line break, when we find, a comma.'
this
 is a file
 that should
 be added
 with a
 line break
 when we find
 a comma.

或者如果你必须使用awk:

awk '{gsub(", ", "\n", $0)}1' delimiter.txt

1
我猜测不需要前导空格。 - hek2mgl
@hek2mgl:不必要,可以删除。 - TheBatmanWhoLaughs

3
使用awk解决方案:
awk 1 RS=", " file
this
is a file
that should
be added
with a
line break
when we find
a comma.

3
+1 但在我看来,你应该始终声明当一个发布的解决方案只适用于某个版本的awk时,这个解决方案是GNU-awk特定的,这是由于RS的多字符设置所致。我认为你也应该把RS设置为",[[:space:]]*",这样它就可以去掉逗号后面的任何空格,并处理逗号后没有空格的情况。 - Ed Morton
1
谢谢提供这个信息。很难知道哪个版本支持什么,但我会记住这个信息。为什么不使用RS=", *"而不是RS=",[[:space:]]*"呢? - Jotne
他可能在逗号之后有一个制表符或其他的空白字符,我个人认为你最好也要处理它们。 - Ed Morton

0

这是使用perl的解决方案:

perl -pe 's#,#\n#g'

这是在OpenBSD或OS X上正常工作的示例:
% echo 'a,b,c,d,e' | perl -pe 's#,#\n#g'
a
b
c
d
e
%

例如,与之前的sed解决方案不同,这个perl在任何地方都可以工作,因为相同的搜索/替换片段在OpenBSD或OS X上的BSD sed中无法工作:
% echo 'a,b,c,d,e' | sed -E 's#,#\n#g'
anbncndne
%

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接