Разница между set argument
и set -- argument
характерна для многих других команд.
Иногда у вас есть аргумент, начинающийся с -
, но на самом деле вы не можете его использовать, потому что команда считает, что (, поскольку он начинается с -
), на самом деле является параметром команды.
То, что --
говорит, фактически :«Достаточно! Все, что следует, даже если оно начинается с -
, является фактическим аргументом».
Обычно (в соответствии со страницами руководства )для этой цели одиночный -
эквивалентен --
.
Пример
Вы можете использовать:
set -- -a -b file1 file2
для установки $1
, $2
, $3
и $4
на -a
, -b
, file1
и file2
соответственно. --
не сохраняется -, это просто индикатор; без этого,-a
и -b
будут интерпретироваться как возможные варианты для самой команды set
.
$ sed -e :a -e '$!N;s/ *\n+ / /;ta' -e 'P;D' testfile
******************
.WER aaa bbb ccc ddd eee
******************
.SDF zzz xxx yyy iii kkk lll
******************
.XCV uuu vvv ggg hhh qqq
******************
http://sed.sourceforge.net/sed1line.txtприводит аналогичный пример.
:a
создать метку «а»
$!N
добавить следующую строку (и новую строку )в пространство шаблонов, ЕСЛИ это не последняя строка ($!)
s/ *\n+ / /
Замените конечные пробелы, новую строку, + и пробел после него одним пробелом
ta
вернуться к маркировке
P
распечатать пространство шаблона. Это приведет к двойному выводу, потому что мы не использовали опцию-n
-для sed, так что теперь нам нужно
D
удалить лишний вывод.
Если вы действительно хотите использовать awk, то, по крайней мере, с GNU awk вы можете сделать что-то вроде
$ gawk -vRS='\n[*]+' -F'[ ]*\n[+][ ]*' '{NF+=0; ORS=RT} 1' file
******************
.WER aaa bbb ccc ddd eee
******************
.SDF zzz xxx yyy iii kkk lll
******************
.XCV uuu vvv ggg hhh qqq
******************
который просто устанавливает соответствующие разделители записей и полей и принудительно -пересобирает запись с разделителями полей (одиночного пробела )по умолчанию.