在每行末尾添加文本


90

我在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手册后仍不清楚如何在命令行上执行此操作?


2
很好的问题,我喜欢您如何设定。
Anthony Rutledge

Answers:


139

您可以尝试使用类似:

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

@弗拉德是的; 但是根据给定的OP的示例输入... IP列表中不应有任何端口号。:)即使有... OP可以s///预先运行另一个sed ,以取出每行末尾的任何端口号。
summea

1
好的,只是澄清一下……也许应该有条件排除端口已经存在的行。
Vlad13年

3
sed '/:[0-9]*$/ ! s/$/:80/'
aragaer 2013年

3
将其添加到您自己的答案中。注释中已经有排除端口行的建议,我刚刚编写了确切的命令。
aragaer 2013年

2
如果文件具有CRLF终止符,:80则将其添加到下一行的开头。dos2unix如有必要,请首先在文件上使用。
djnz0feh,


12

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


12

sed命令的简明版本:

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

说明:

  • sed 小号 tream itor
    • -i n位(就地编辑文件)
    • s ŝ ubstitution命令
    • /replacement_from_reg_exp/replacement_to_text/ 声明
    • $匹配行尾(replace_from_reg_exp
    • :80您要在每行末尾添加的文本(replace_to_text
  • file.txt 文件名

0

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

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

0
  1. 您也可以使用反向引用技术来实现

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

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

-1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.