如何在unix中的每一行末尾添加文本

Posted

技术标签:

【中文标题】如何在unix中的每一行末尾添加文本【英文标题】:How to add text at the end of each line in unix 【发布时间】:2014-05-29 12:33:03 【问题描述】:

我正在做某些文本处理操作,终于能够得到一个像这样的文件

india
sudan
japan
france

现在我想在上面的文件中添加注释,就像在最终文件中一样,它应该是

india | COUNTRY
sudan | COUNTRY
japan | COUNTRY
france | COUNTRY

喜欢整个文件中的相同评论。我该怎么做?

【问题讨论】:

【参考方案1】:

有很多方法:

sed:将$(行尾)替换为给定的文本。

$ sed 's/$/ | COUNTRY/' file
india | COUNTRY
sudan | COUNTRY
japan | COUNTRY
france | COUNTRY

awk:打印行加上给定的文本。

$ awk 'print $0, "| COUNTRY"' file
india | COUNTRY
sudan | COUNTRY
japan | COUNTRY
france | COUNTRY

最后,纯bash:逐行读取并与给定文本一起打印。请注意,不鼓励这样做,如 Why is using a shell loop to process text considered bad practice?

中所述
$ while IFS= read -r line; do echo "$line | COUNTRY"; done < file
india | COUNTRY
sudan | COUNTRY
japan | COUNTRY
france | COUNTRY

【讨论】:

假设行以换行符(“\n”)结尾,所有解决方案都有效。我有一个来自 Windows 的文件,带有回车符和换行符(“\r\n”),我在行首得到了所需的注释。我刚刚用 dos2unix 转换了文件,所有解决方案都可以正常工作。 MacOS 只使用回车 (\r),因此,你必须在那里写 sed 's/\r/ | COUNTRY/' file【参考方案2】:

另一个awk

awk '$0=$0" | COUNTRY"' file

【讨论】:

我也想过这个,这可能是最短的awk解决方案... +1 只是为了好玩,我将性能与 20M 行文件进行了比较。 time awk 'print $0, "| COUNTRY"' a &amp;&gt;/dev/null 大约需要 0.003 秒,而 time awk '$0=$0" | COUNTRY"' a &amp;&gt;/dev/null 大约需要 4.03 秒。我猜这个任务会消耗更多的额外时间。 @fedorqui 有趣。短并不总是最好的:) @Jotne 确实,我没想到会有这样的结果。但当然,这是一个极端情况,你的答案是完全有效的。 我无法正常运行...我明白了 | COUNTRY 在该行的开头...为什么呢?【参考方案3】:

对于更模糊的方法:

yes '| COUNTRY' | sed $(wc -l < file)q | paste -d ' ' file -

【讨论】:

附带说明,在我的测试中,paste 工具非常快,即使对于大 (>20MB) 测试文件也是如此。 @00prometheus:没有-d 选项,paste 默认使用制表符连接。您可以将空格移动到| 之前,但您仍然需要-d '' 来取消制表符。 你是对的。我删除了我的评论以避免误导任何人。【参考方案4】:

您也可以为此使用xargsecho

< file xargs -d "\n" -rI % echo '% | COUNTRY'

这将使xargs 获取file 的每一行并一次将其传递给指定的echo 命令,用输入行替换%(或您选择的任何字符)。

† 默认情况下,xargs 会将多行输入传递给单个命令,并将它们全部附加到其参数列表中。但是指定-I % 会使xargs 将输入放在命令中的指定位置,并且一次只放一行,根据需要运行echo

【讨论】:

以上是关于如何在unix中的每一行末尾添加文本的主要内容,如果未能解决你的问题,请参考以下文章

如何在除最后一行之外的每一行末尾添加逗号?

如何在 Vim 的每一行末尾添加一个字符串?

使用python在文本文件的每一行末尾添加一个特定的字符串(在这种情况下为“\\\hline”以准备一个乳胶表)

如何在文本文件中的每一行的开头添加序号

从 RichTextBox 中的每一行获取文本?

用linux c语言编写 为一个文件里面的内容的每一行添加一个指定的字符