我有一个看起来像这样的文件
$ cat IP
10.3.1.1
10.4.1.1
10.6.3.1
10.19.4.2
10.22.3.4
我如何让它看起来像:
$ cat IP
10.3.1.1, 10.4.1.1, 10.6.3.1, 10.19.4.2, 10.22.3.4
答案1
和perl
:
perl -pe 's/\n/, / unless eof' IP
添加-i
编辑文件i
nplace.txt 的选项。或者-i.orig
就地编辑它但保留原始内容为IP.orig
.
使用zsh
shell,您还可以使用以下命令将这些 IP 加载到数组中:
ips=( ${(f)"$(<IP)"} )
然后j
用逗号写回:
print -r -- ${(j[, ])ips} > IP
与一次处理一行的 perl 相反,perl 将整个文件加载到内存中。
另外两个区别:
- 空行被丢弃
- 即使原始文件不包含任何空文件或最后一行未正确分隔的文件,也始终在末尾添加换行符。
答案2
通过 GNU 实现sed
:
sed -z 's/\n*$//;s/\n/, /g;s/$/\n/' IP
答案3
也许
perl -e 'print join(", ", map { chomp; $_ } <>), "\n"' IP
或者
awk '{ printf "%s%s", c, $0; c = ", " } END { print "" }' IP
或者进行快速而肮脏的黑客攻击,受到文件行数的限制(可能只有 8000 行),并记住这xargs
并不是真正为此设计的
xargs <IP | sed 's/ /, /g'
所有这些都会从示例数据集中产生相同的输出:
10.3.1.1, 10.4.1.1, 10.6.3.1, 10.19.4.2, 10.22.3.4
然后,您可以将该输出重定向到临时文件,然后覆盖原始文件。在这里,替换command_from_above
为您选择的将更改写入的任何命令(在此答案或其他任何人的此处)标准输出而不是原始文件:
command_from_above >"IP.$$.tmp" && mv -f -- "IP.$$.tmp" IP
rm -f -- "IP.$$.tmp"
答案4
使用 awk:
awk '{printf "%s%s", (NR==1) ? "" : ", ", $0}END{print ""}'
这将为除第一行之外的每一行添加逗号前缀。