我有一個包含以下內容的檔案,并且想要洗掉最后一個逗號(在這種情況下,'c' 和 'f' 之后的逗號)。
heading1(
a,
b,
c,
);
some more text
heading2(
d,
e,
f,
);
這必須使用 bash 而不是 Perl 或 Python 等,因為它們沒有安裝在我的目標系統上。我可以使用sed等awk,但我不能將 sed 與-z引數一起使用,因為我使用的是舊版本的實用程式。
所以sed -zi 's/,\n);/\n);/g' $file不在桌子上。
任何幫助將不勝感激。謝謝
uj5u.com熱心網友回復:
這可能適用于您的 sed 版本。再說一次,它可能不會。
sed 'x;1d;G;/;$/s/,//;$!s/\n.*//' $file
粗略翻譯:“用保留空間交換這一行。如果這是第一行,請不要再使用它。將保留空間附加到緩沖區中的行(這樣你就可以看到最后一行和當前行) ). 如果你有一個分號結束,洗掉逗號。如果你不在檔案的最后一行,洗掉你有的兩行中的第二行(即當前行,我們將在后面處理我們看到下一個)。”
uj5u.com熱心網友回復:
使用 awkRS="^$"讀取整個檔案并使用正則運算式替換部分文本:
$ awk -v RS=^$ '{gsub(/,\n\);/,"\n);")}1' file
一些輸出:
heading1(
a,
b,
c
);
...
uj5u.com熱心網友回復:
我會利用 sed 中的“保留空間”,這樣您就可以向前看一行,看看它是否是 ')'。
接下來是一個“sed 腳本”;所以只需將''放在它周圍并在它前面加上“sed”:
sed '
首先無條件地保留第一行,然后將其洗掉(強制跳到下一行)
1 {
h
d
}
對于以 ')' 開頭的每一行,交換當前緩沖區和保持緩沖區(因此您現在在當前緩沖區中有前一行),洗掉尾隨逗號(如果有),然后再次交換:
/^)/ {
x
s/,$//
x
}
交換,以便我們列印上一行
x
在最后一行,列印上一行,然后檢索最后一行并列印它。還要從最后一行洗掉尾隨逗號。
$ {
p
x
s/,$//
}
到達 sed 腳本的末尾時,將列印當前緩沖區;所以最后沒有“p”。
如前所述,從頭開始關閉報價。
'
綜上所述,我們得到:
sed '
1 {
h
d
}
/^)/ {
x
s/,$//
x
}
x
$ {
p
x
s/,$//
}
'
如果您需要向前掃描多行,而不是“x”來交換一行,使用“H;g”附加到保留空間,然后將保留空間復制到當前緩沖區,然后“P;D”列印并洗掉到第一個換行符。(H、P 和 D 是 GNU 擴展。)
uj5u.com熱心網友回復:
這應該適用于顯示輸入的 GNU sed 和 BSD sed:
sed -e ':a' -e '/,\n);$/!{N' -e 'ba' -e '}' -e 's/,\n);$/\n);/' file.txt
我們連接模式空間中的行,直到它以,\n);. 然后我們洗掉逗號,列印(默認)并用新行重新開始回圈。
使用 GNU sed 的更簡單、更易讀的版本(你沒有):
sed ':a;/,\n);$/!{N;ba};s/,\n);$/\n);/' file.txt
uj5u.com熱心網友回復:
awk 'BEGIN { getline line } /^);/ { sub(/,$/, "", line) } { print line; line = $0 } END { print line }'
uj5u.com熱心網友回復:
使用awk:
awk '
$0==");" {sub(/,$/, "", l)}
FNR!=1 {print l}
{l=$0}
END {print l}'
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/425659.html
上一篇:從每個單元格中洗掉重復項
