Shell-Script

刪除大部分但不是所有包含輸入符 (r) 的行

  • June 3, 2022

我有一個使用輸入符 (\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

引用自:https://unix.stackexchange.com/questions/704866