2013-06-12 97 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 
相關問題