Я не совсем понимаю вашу конкретную проблему, простой sed
может достичь того, что вы показываете:
$ sed 's/\ballow\b/not/g' afile
<Directory />
words
not
bus
\b
защищает, чтобы мы заменяли только слова, такие как allow
, строкой not
. Если вы хотите удалить строки, содержащие строку allow
, вы также можете использовать для этого sed
:
$ sed '/\ballow\b/d' afile
<Directory />
words
bus
</Directory>
Если вы хотите использоватьawk
:
$ cat nl.awk
{
if ( $0 == "" ) {
count = 0
print
} else
print ++count, $0
}
Выходы:
$ awk -f nl.awk infile
1 this is the first
2 second line
3 not last line
1 fourth but first
2 second in list
3 seventh in file
4 seventh with nl
Использование awk:
awk '{ c=NF?++c:"" } {print c,$0}' file
Это значит:
NF?
(любой (не -пробел )символ ), увеличьте c
на ++c
. print c,$0
К сожалению, это короткое решение преобразует пустые строки в строки, содержащие пробел (или, фактически, в значение OFS ). Если это проблема, используйте это (аналогичное )решение:
awk 'NF{$0=++c" "$0}!NF{c=0}1' file
В этом решении нет причин заменять пустые строки на \:\:
.