2017-01-03 57 views
0

必須編寫一個以這種方式更新文件的腳本。通過檢查表達式刪除換行符,使用sed

原始文件:

<?blah blah blah?> 
<pen> 
<?pineapple?> 
<apple> 
<pen> 

最終文件:

<?blah blah blah?><pen> 
<?pineapple?><apple><pen> 

你在哪裏都在該文件,如果新線包機後面沒有

<? 

我們必須刪除換行符,以便在前一行末尾附加它。

如果你解釋你的sed是如何工作的話,它也會非常有用。

+0

查看http://stackoverflow.com/questions/1251999/how-can-i-replace-a-newline-n-using-sed。適應你的需求 – pringi

回答

0

Perl的溶液:

perl -pe 'chomp; substr $_, 0, 0, "\n" if $. > 1 && /^<\?/' 
  • -p讀取由線輸入線,印刷的變化後的各線
  • chomp去除最終換行符
  • substr用4個參數修改輸入串,這裏如果它不是第一行($.是輸入行號),並且行以<?開頭,則它將預置換行符。
+0

There是標題中的'使用sed'... – MaanooAk

+0

@MaanooAk:適合工作的正確工具等。 – choroba

0

桑達解決方案:

sed ':a;N;$!ba;s/\n\(<[^?]\)/\1/g' file > newfile 

的基本思想是通過?

與除\n你所匹配替換每

\n其次<緊隨其後。

0

當你滿意了把每<?在一行開始時的解決方案,你可以用sed結合tr

tr -d '\n' < inputfile| sed 's/<?/\n&/g;$s/$/\n/' 

說明:
我用tr ... < inputfile而不是cat inputfile | tr ...避免額外的cat通話。
sed命令有2個部分。
s/<?/\n&/g它會插入一個換行符,並用&它會插入匹配的字符串(在這種情況下總是<?,所以它只會保存一個字符)。
With $s/$/\n/在最後一行的末尾添加一個換行符。

編輯:當你只有<?之前想換行,當你有它們了, 可以使用awk

awk '$1 ~ /^<\?/ {print} {printf("%s",$0)} END {print}' 

說明:
考慮換行符作爲行的開始,而不是結束。然後你的問題調換成「的時候,符合<?開始寫一個換行符。你必須逃離?和使用^爲線的開始。

awk '$1 ~ /^<\?/ {print}' 

下一頁打印你沒有一個換行符讀線。 並且你想在最後換行。