Shell-Script
刪除大部分但不是所有包含輸入符 (r) 的行
我有一個使用輸入符 (\r) 輸出太多狀態行的程序。我可以通過管道過濾所有這些狀態行
sed '/\r/d'
相反,我想過濾所有這些行,例如每 3 行。這是否可以使用標準的 Unix-Tools(awk?)或者我需要一個腳本嗎?沒有 CR 的行應該保持不變。
給定輸出:
$ (printf '%s\n' {1..10}; printf '%s\r\n' {1..10}; printf '%s\n' {1..10};) | cat -v 1 2 3 4 5 6 7 8 9 10 1^M 2^M 3^M 4^M 5^M 6^M 7^M 8^M 9^M 10^M 1 2 3 4 5 6 7 8 9 10
想要的輸出(或任何其他模式):
1 2 3 4 5 6 7 8 9 10 1^M 4^M 7^M 10^M 1 2 3 4 5 6 7 8 9 10
$ awk '!(/\r$/ && ((++c)%3 != 1))' file | cat -v 1 2 3 4 5 6 7 8 9 10 1^M 4^M 7^M 10^M 1 2 3 4 5 6 7 8 9 10
原答案:
聽起來你所需要的就是這個,使用任何 awk:
awk -v RS='\r' '{ORS=(NR%10000 ? "" : RS)} 1'
例如使用這個作為輸入:
$ printf '%s\r\n' {1..10} | cat -v 1^M 2^M 3^M 4^M 5^M 6^M 7^M 8^M 9^M 10^M
刪除除每 3 次以外的所有內容
\r
:$ printf '%s\r\n' {1..10} | awk -v RS='\r' '{ORS=(NR%3 ? "" : RS)} 1' | cat -v 1 2 3^M 4 5 6^M 7 8 9^M 10