регулярное выражение awk заменяет любую цифру на "", но не делает этого для чисел в скобках

Просто:

awk '$1=NR "."'

Это заменит первое поле (первый текст перед пробелом )на строку (запись )номер и точку. Поскольку номер записи всегда положительный и больше 0, результат присваивания всегда будет истинным, что приведет к печати строки (записи )с измененным первым полем.

При изменении первого поля NF (количество полей )и нулевое поле ($0 )получают повторно -вычисляемое преобразование всех повторяющихся белых -пробелов в один пробел.

То есть :строки, имеющие несколько смежных пробелов (и табуляции ), объединяются в один пробел.

Если из обработки awk необходимо спасти несколько пробелов, это становится довольно запутанным (только GNU awk имеет patsplit):

awk '{
       n=patsplit($0,f,/[^ \t\n]+/,s);   # split the line storing whitespace.
       f[1] = NR "."                     # only change actually needed.
       for(i=0;i<=n;i++)                 # for all fields (and separators)
       {  
          printf("%s%s",f[i],s[i])       # print each field and separator.
       }
       print("")                         # cause the printing of an OFS
     }
    ' patsplitfile
0
21.09.2020, 19:25
2 ответа

С GNU awk для мульти -char RS:

$ echo '(TJ)-8.5(o12)-3.2(p1)-15.3(ik)-1.2(1)' |
    awk -v RS='[(][^)]+)' '{gsub(/[0-9]/,""); printf "%s%s", $0, RT}'
(TJ)-.(o12)-.(p1)-.(ik)-.(1)
0
18.03.2021, 23:03

С GNUawk:

gawk '{print gensub(/(\([^)]*\))|[0123456789]+/, "\\1", "g")}'

В основном перевод sed's:

sed -E 's/(\([^)]*\))|[0123456789]+/\1/g'
1
18.03.2021, 23:03

Теги

Похожие вопросы