2013-06-12 45 views
0

我正在使用ipset(iptables扩展名)要求CIDR格式化条目在每个CIDR行末尾附加“[single space]”的bash脚本用于输入到该集合中。例如,文件中的一些随机项应该是这样的:向每行添加空格和字符,除最后一个

175.30.0.0/15 \ 
175.42.0.0/15 \ 
175.76.0.0/15 

如果没有\最后一行表示列表的末尾。使用sed或任何其他方法,在它之前附加此符号和空格的最简单方法是什么?有没有合理的方法来写出一个条件来省略最后一个斜杠?

回答

0

awk中的解决方案:

awk 'NR > 1{print line" \\"}{line=$0;}END{print $0" "}' inputfile 
+0

您的解决方案不显示输入的第一行。即我只得到42和76部分... –

+0

对不起,粘贴错误的版本。编辑版本应该可以工作。 – fileunderwater

+0

看起来更好:-) –

6
sed -e 's/$/ \\/' -e '$s/ \\$//' 

将空格反斜杠添加到每行的末尾;删除最后一行末尾的空格反斜杠。

+0

很好的解释 – CodeFarmer

1

这似乎是工作,这里假设空行之间

$ 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 
+0

这不会在最后一行添加一个空格,这似乎是需要的。 – fileunderwater

+0

@fileunderwater,如果您需要在最后一行添加一个空格,您应该改述问题以包含该详细信息。 –

+0

@ WilliamPursell->这个问题(不是我的)已经这么说了:“..have”[单个空格] \“附加到每行......最后一行没有'\\'表示结束的名单“。 – fileunderwater

0
awk '{printf "%s%s",sep,$0; sep=" \\\n"} END{print ""}' file 
+1

你错过了什么吗?在我最大的情况下,我在输出中得到了'175.30.0.0/15 \ \ 175.42.0.0/15 \ \ 175.76.0.0/15',除了最后一行外没有换行符。 – anubhava

+0

是的,我忘了分隔符字符串末尾的'\ n'。现在修好,谢谢。 –

0

你可以使用这个wk命令:

awk '{arr[cnt++]=$0;} 
     END {for (i=0; i<length(arr)-1; i++) print arr[i]" \\"; print arr[i]" "}' input 
相关问题