В вашем ответе myString
не является массивом, но вы используете ссылку на массив для доступа к нему. Это работает в Bash, потому что на 0-й элемент массива можно ссылаться только по имени переменной и наоборот. Это означает, что вы можете использовать:
for aString in $myString; do
чтобы получить тот же результат в этом случае.
В своем вопросе вы говорите, что вывод включает «BATCH-DO». Я получаю «DO-BATCH», поэтому я предполагаю, что это опечатка.
Единственный способ получить дополнительные строки без использования цикла for
— использовать более длинное регулярное выражение. Кстати, я рекомендую помещать регулярные выражения Bash в переменную. Это значительно упрощает использование определенных типов (например, тех, которые содержат пробелы или специальные символы).
pattern='(([[:alpha:]]*)-([[:alpha:]]*)) +(([[:alpha:]]*)-([[:alpha:]]*))'
[[ $myString =~ $pattern ]]
declare -p BASH_REMATCH #dump the array
Выходы:
declare -ar BASH_REMATCH='([0]="DO-BATCH BATCH-DO" [1]="DO-BATCH" [2]="DO" [3]="BATCH" [4]="BATCH-DO" [5]="BATCH" [6]="DO")'
Дополнительный набор круглых скобок необходим, если вы хотите захватить отдельные подстроки, а также фразы через дефис. Если вам не нужны отдельные слова, вы можете удалить внутренние наборы скобок.
Обратите внимание, что вам не нужно использовать if
, если вам нужно только извлечь подстроки. Вам нужно только if
, чтобы выполнить условное действие на основе совпадения.
Также обратите внимание, что ${BASH_REMATCH[0]}
будет сильно отличаться от более длинного регулярного выражения, поскольку оно содержит полное совпадение.
person
Dennis Williamson
schedule
19.07.2012
${BASH_REMATCH[3]}
равным BATCH и т. д.? - person chepner   schedule 19.07.2012