Дано:
$ cat file
1!
2!
3!
4!
5!
6!
7!
8!
9!
10!
11!
12!
Вы можете использовать awk:
$ awk 'NR%4==0{sub(/!$/,"")}1' file
1!
2!
3!
4
5!
6!
7!
8
9!
10!
11!
12
А если у вас есть gawk
, вы можете изменить на место:
$ gawk -i inplace 'NR%4==0{sub(/!$/,"")}1' file
$ cat file
1!
2!
3!
4
5!
6!
7!
8
9!
10!
11!
12
Если у вас есть только POSIX awk, вы можете эффективно получить замену на месте, используя временный файл:
$ awk 'NR%4==0{sub(/!$/,"")}1' file >tmp_file && mv tmp_file file
(Это то, что GNU sed, GNU awk, perl или ruby в любом случае делают под прикрытием с помощью 'замена на месте ...)