Перенумеровать список, но не порядок

POSIXtest(или[... ])знает только об одном знаке равенства:

s1 = s2
True if the strings s1 and s2 are identical; otherwise, false.

Но Bash также принимает знак двойного равенства, хотя встроенная справка не допускает этого (в руководстве ):

$ help test | grep =  -A1
  STRING1 = STRING2
                 True if the strings are equal.
  STRING1 != STRING2
                 True if the strings are not equal.

Что касается других оболочек, это зависит от обстоятельств. Ну, особенно Дэш здесь упрямый:

$ dash -c '[ x == x ] && echo foo'
dash: 1: [: x: unexpected operator

но

$ yash -c '[ x == x ] && echo foo'
foo
$ busybox sh -c '[ x == x ] && echo foo'
foo
$ ksh93 -c '[ x == x ] && echo foo'
foo

zshздесь немного странно, ==считается специальным оператором, поэтому его нужно заключать в кавычки:

$ zsh -c '[ x == x ] && echo foo'
zsh:1: = not found

$ zsh -c '[ x "==" x ] && echo foo'
foo

Внешняя утилита test/ [из GNU coreutils в моем Debian поддерживает ==(, но руководство не признает этого ), а утилита для OS X — нет.

Таким образом, с test/ [.. ]используйте =, так как он более широко поддерживается.


С конструкцией[[... ]]и =и ==равны (по крайней мере в Bash )и правая часть оператора принимается за шаблон, как в имени файла glob, если он не заключен в кавычки. (Имена файлов не раскрываются внутри[[... ]])

$ bash -c '[[ xxx == x* ]] && echo foo'
foo

Но, конечно, эта конструкция не является стандартной.:

$ dash -c '[[ xxx == x* ]] && echo foo'
dash: 1: [[: not found
$ yash -c '[[ xx == x* ]] && echo foo'
yash: no such command ‘[[’

И хотя он есть в Busybox, он не выполняет сопоставление с образцом:

$ busybox sh -c '[[ xx == xx ]] && echo yes || echo no'
yes
$ busybox sh -c '[[ xx == x* ]] && echo yes || echo no'
no

2
20.09.2019, 23:37
1 ответ

Просто:

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
6
27.01.2020, 21:51

Теги

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