AWK использовать запятую (необязательно), а затем несколько пробелов в качестве FS
Что мне нужно сделать, это разобрать строку следующего вида
-option optionArgument, --alternativeNotation Некоторый текст, ничего интересного...
Я установил FS на
BEGIN {
FS = ",?\ +"
}
но это не сработало... оно должно разбиваться на каждое случайное количество пробелов (по крайней мере, на одну), за которыми следует запятая (необязательно). Есть идеи?
Спасибо заранее,
Оливер
3 ответа
FS = "[,]*[ ]+"
Это делает запятую необязательной, но не пробел. Это создает отдельное поле из каждого параметра -option и optionArg, что, как я полагаю, вы хотели.
awk 'BEGIN {FS = "[,]*[ ]+";} { print $1; print $2; print $3; print $4; print $5;}' << EOF
> -option1 hello, --option2 world, -option3
> EOF
-option1
hello
--option2
world
-option3
Ваш FS
выполняет то, что вы описываете в своем вопросе, но обратная косая черта перед пробелом может быть избыточной в зависимости от цитирования оболочки:
$ echo '-option optionArgument, --alternativeNotation Some text, nothing of interest...' | \
nawk 'BEGIN {
FS=",? +";
OFS="][";
}
{
print "["$1,$2,$3,$4"]";
print "["$5,$6,$7,$8"]";
}'
[-option][optionArgument][--alternativeNotation][Some]
[text][nothing][of][interest...]
Что вы хотите, чтобы поля были?
@OP, в следующий раз попробуй описать, каков твой конечный результат.
echo "-option1 hello, --option2 world, -option3" | awk 'BEGIN{FS=",[ ]+"}
{
for(i=1;i<=NF;i++){
print $i
}
}
'
выход
$ ./shell.sh
-option1 hello
--option2 world
-option3
Кроме того, нет необходимости проверять наличие нескольких пробелов. Просто используйте запятую в качестве разделителя и обрежьте оставшиеся пробелы позже.
echo "-option1 hello, --option2 world, -option3" | awk 'BEGIN{FS=","}
{
for(i=1;i<=NF;i++){
gsub(/^ +| +$/,"",$i)
print $i
}
}
'
выход
$ ./shell.sh
-option1 hello
--option2 world
-option3