我在 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 手册之后还是不清楚怎么在命令行上做?
你可以试试这样写:
sed -n 's/$/:80/' ips.txt > new-ips.txt
前提是你的文件格式正如你在问题中所描述的那样。
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
最终的结果是这样的:
sed 's/.*/&:80/' abcd.txt >abcde.txt
如果您想在每一行的末尾添加文本(在同一个文件中) ,您可以使用 -i参数,例如:
-i
sed -i'.bak' 's/$/:80/' foo.txt
然而,-i选项是非标准 Unix 扩展,可能不适用于所有操作系统。
因此,你可以考虑使用 ex(相当于 vi -e/vim -e) :
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]。
[0-9]
使用文本编辑器,检查每行末尾的 ^M(control-M 或回车符)。您需要首先删除它们,然后在行的末尾附加额外的文本。
^M
sed -i 's|^M||g' ips.txt sed -i 's|$|:80|g' ips.txt
sed -i s/$/:80/ file.txt
/replacement_from_reg_exp/replacement_to_text/
如果您希望原始文件保持不变,并将结果放在另一个文件中,那么放弃 -i选项并将重定向(>)添加到另一个文件:
>
sed s/$/:80/ file.txt > another_file.txt
Sed-i’s/$/,/g’foo.txt
我经常这样做,以便在输出的末尾添加逗号,这样我就可以轻松地将其复制并粘贴到 Python (或您最喜欢的 lang)数组中
您还可以使用反向引用技术来实现这一点
sed -i.bak 's/\(.*\)/\1:80/' foo.txt
You can also use with awk like this
awk '{print $0":80"}' foo.txt > tmp && mv tmp foo.txt