我正在编写一个 bash 脚本,其中 ipset(一个 iptables 扩展)要求 CIDR 格式的条目在每个 CIDR 行的末尾附加“[单个空格]\”以输入到集合中。例如,文件中的一些随机条目应如下所示:
175.30.0.0/15 \
175.42.0.0/15 \
175.76.0.0/15
没有 a 的最后一行\
表示列表的结尾。使用sed
或任何其他方法,添加这个符号和它之前的空格的最简单方法是什么?有没有一种合理的方法来写一个省略最后一个斜杠的条件?
sed -e 's/$/ \\/' -e '$s/ \\$//'
在每行的末尾添加空格反斜杠;删除最后一行末尾的空格反斜杠。
这似乎有效,这里假设中间有空行
$ cat input
175.30.0.0/15
175.42.0.0/15
175.76.0.0/15
$ sed -e '$ ! {/./s/$/ \\/}' input
175.30.0.0/15 \
175.42.0.0/15 \
175.76.0.0/15
如果没有空行,则可以缩短为:
$ sed -e '$ ! s/$/ \\/' input
你可以使用这个 awk 命令:
awk '{arr[cnt++]=$0;}
END {for (i=0; i<length(arr)-1; i++) print arr[i]" \\"; print arr[i]" "}' input
awk '{printf "%s%s",sep,$0; sep=" \\\n"} END{print ""}' file
awk 解决方案:
awk 'NR > 1{print line" \\"}{line=$0;}END{print $0" "}' inputfile