在每行末尾添加文本

我在 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 手册之后还是不清楚怎么在命令行上做?

399073 次浏览

你可以试试这样写:

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

前提是你的文件格式正如你在问题中所描述的那样。

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


另外,如果您有一个正好已经附加了端口号的 IP 编号列表(如 弗拉德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
sed 's/.*/&:80/'  abcd.txt >abcde.txt

如果您想在每一行的末尾添加文本(在同一个文件中) ,您可以使用 -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]

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

sed -i 's|^M||g' ips.txt
sed -i 's|$|:80|g' ips.txt

Sed命令的简明版本:

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

说明:

  • 流程
  • -i n-place (编辑文件到位)
  • 替换命令
  • /replacement_from_reg_exp/replacement_to_text/语句
  • $匹配行尾(Place _ from _ reg _ exp 替换 _ from _ reg _ exp)
  • 要在每行末尾添加的 :80文本(置换 _ to _ text)
  • 文件名

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

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

sed s/$/:80/ file.txt > another_file.txt

Sed-i’s/$/,/g’foo.txt

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

  1. 您还可以使用反向引用技术来实现这一点

    sed -i.bak 's/\(.*\)/\1:80/' foo.txt
    
  2. You can also use with awk like this

    awk '{print $0":80"}' foo.txt > tmp && mv tmp foo.txt