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
Просто:
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