122

我在 Linux 命令行上,我有文件

127.0.0.1
128.0.0.0
121.121.33.111

我想

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

我记得我的同事为此使用 sed,但是在阅读 sed 手册后仍然不清楚如何在命令行上执行此操作?

4

7 回答 7

171

您可以尝试使用类似的东西:

sed -n 's/$/:80/' ips.txt > new-ips.txt

前提是您的文件格式与您在问题中描述的一样。

s///替换命令匹配(查找)文件中每一行的结尾(使用$字符),然后附加(替换:80到每行的末尾。该ips.txt文件是您的输入文件......并且new-ips.txt是您新创建的文件(您更改的最终结果。


此外,如果您有一个 IP 号码列表,碰巧已经附加了端口号(如Vlad所述,并且由aragaer给出),您可以尝试使用以下内容:

sed '/:[0-9]*$/ ! s/$/:80/' ips.txt > new-ips.txt

因此,例如,如果您的输入文件看起来像这样(注意:80

127.0.0.1
128.0.0.0:80
121.121.33.111

最终结果将如下所示:

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80
于 2013-04-12T18:38:02.383 回答
45

sed命令的简洁版本:

sed -i s/$/:80/ file.txt

解释:

  • sed 串流编辑_
  • -i i n-place(就地编辑文件)
  • s 替换命令
  • /replacement_from_reg_exp/replacement_to_text/陈述
  • $匹配行尾(replacement_from_reg_exp
  • :80您要在每行末尾添加的文本 ( replacement_to_text )
  • file.txt文件名

在不修改原始文件的情况下如何实现?

如果您想保持原始文件不变并将结果保存在另一个文件中,则放弃-i选项并将重定向 ( >) 添加到另一个文件:

sed s/$/:80/ file.txt > another_file.txt
于 2018-08-30T17:17:52.147 回答
16
sed 's/.*/&:80/'  abcd.txt >abcde.txt
于 2014-12-20T09:31:44.887 回答
15

如果您想在每一行的末尾就地(在同一个文件中)添加文本,您可以使用-i参数,例如:

sed -i'.bak' 's/$/:80/' foo.txt

但是-i,选项是非标准 Unix 扩展,可能并非在所有操作系统上都可用。

所以你可以考虑使用ex(相当于vi -e/ vim -e):

ex +"%s/$/:80/g" -cwq foo.txt

这将添加:80到每一行,但有时它可以将其附加到空白行。

所以更好的方法是检查该行是否实际包含任何数字,然后附加它,例如:

ex  +"g/[0-9]/s/$/:80/g" -cwq foo.txt

如果文件具有更复杂的格式,请考虑使用正确的正则表达式,而不是[0-9].

于 2015-05-25T13:11:26.673 回答
3
  1. 您也可以使用反向引用技术来实现这一点

    sed -i.bak 's/\(.*\)/\1:80/' foo.txt
    
  2. 您也可以像这样使用 awk

    awk '{print $0":80"}' foo.txt > tmp && mv tmp foo.txt
    
于 2020-04-11T08:39:32.060 回答
1

使用文本编辑器检查^M每行末尾的(control-M 或回车)。您需要先删除它们,然后在行尾附加附加文本。

sed -i 's|^M||g' ips.txt
sed -i 's|$|:80|g' ips.txt
于 2017-06-06T00:21:19.033 回答
0

sed -i 's/$/,/g' foo.txt

我经常这样做是为了在输出的末尾添加一个逗号,这样我就可以轻松地将其复制并粘贴到 Python(或您最喜欢的语言)数组中

于 2019-10-07T03:49:52.070 回答