【问题标题】:to insert line breaks in a file whenever a comma is encountered-Shell script每当遇到逗号时在文件中插入换行符-Shell 脚本
【发布时间】:2013-08-28 11:08:17
【问题描述】:

我需要编写一个 shell 脚本来通过插入换行符来重新格式化文件。条件是在文件中遇到逗号时要插入换行符。

例如,如果文件delimiter.txt 包含:

this,是一个文件,应该添加一个,换行符,当我们找到时,一个逗号。

输出应该是:

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 并打印结果,它不是编辑器。

标签: shell unix awk


【解决方案1】:

使用 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
  • 您使用的是什么版本的 sed?我使用的是 gnu 版本。
  • 在 sed 脚本中使用 \n 是不可移植的,可移植的方法是使用反斜杠后跟文字换行符,因此您的脚本位于两行,sed 's/, /<backslash> 在第一行, /g' file_name 在第二个。您也应该将, 更改为,[[:space:]]* 或等效项。
  • @EdMorton 感谢您的建议。 :)
  • 第二个换行符之前需要一个反斜杠。
【解决方案2】:

这就是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

【讨论】:

  • 我猜前导空格是不需要的
  • @hek2mgl : 没必要,可以去掉
【解决方案3】:

使用 awk 的解决方案:

awk 1 RS=", " file
this
is a file
that should
be added
with a
line break
when we find
a comma.

【讨论】:

  • +1 但恕我直言,您应该始终说明发布的解决方案何时特定于 awk 的一个版本,而这个是 GNU-awk 特定的,由 RS 的多字符设置提供。我认为您也应该将其设为 RS=",[[:space:]]*" ,这样它就可以去除逗号后的所有空格,并处理逗号后没有空格的情况。
  • 感谢您提供此信息。知道哪个版本支持什么并不容易,但我会将此信息添加到我的脑海中。为什么不用RS=", *" 而不是RS=",[[:space:]]*"
  • 他可能在逗号后有一个制表符或其他一些空格,而不是一个空白字符,恕我直言,您不妨照顾所有/所有这些。
【解决方案4】:

这是使用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 可以在任何地方使用,因为相同的搜索/替换 sn-p 不适用于 OpenBSD 或 OS X 上的 BSD sed

% echo 'a,b,c,d,e' | sed -E 's#,#\n#g'
anbncndne
%

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 2013-08-15
    • 2018-11-18
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    相关资源
    最近更新 更多