2016-08-28 2 views
0

Я пытаюсь прочитать каждую строку текстового файла и извлечь имя перед .tst и сохранить каждое соответствие в массив переменных. вот пример текстового файла:bash: для каждой строки в файле txt соответствие регулярному выражению и сохранение его в массив переменных

someTest.tst (/blah/blah/blah), 
    someOtherfile.tst (/some/other/blah), 
    hello.tst (/not/the/same/blah), 
    hi.tst (/is/this/blah), 

Существует куча пробелов в каждой строке перед персонажами.

Я хотел бы извлечь следующие значения и хранить их в переменной массива:

someTest 
someOtherfile 
hello 
hi 

Я попытался с помощью СЭД и AWK, но мои знания с либо не статус экспертном уровне и, таким образом, у меня возникли проблемы достигая того, чего я хочу. Любое понимание?

ответ

3

Вам не нужно регулярное выражение для этого.

arr=() 
while read -r name _; do 
    [[ $name = *.tst ]] || continue # skip lines not containing .tst 
    arr+=("${name%.tst}") 
done <input.txt 

declare -p arr # print array contents 
  • read принимает список направлений; поля (как определено путем разделения ввода на символы в IFS) заполняются в переменные по мере их чтения, а последний получатель получает все оставшееся содержимое в строке (включая пробелы). Таким образом, read -r name _ помещает первое поле в name и все оставшееся содержимое входной строки в переменную с именем _.
  • [[ $name = *.tst ]] || continue пропускает все строки, где первое поле не заканчивается .tst.
  • "${name%.tst}" раскрывается до содержания "$name", с суффиксом .tst удаляется, если присутствует.
  • Модель while read; do ...; done <inputfile описана более подробно в BashFAQ #1.

Однако, если вы хотел использовать регулярные выражения, которые могли бы выглядеть следующим образом:

re='^[[:space:]]*([^[:space:]]+)[.]tst[[:space:]]' 

arr=() 
while IFS= read -r line; do 
    [[ $line =~ $re ]] && arr+=("${BASH_REMATCH[1]}") 
done <input.txt 

declare -p arr # print array contents 

Использование [[ $string =~ $regex ]] оценивает $regex как ERE и, если он совпадает, ставит полноту из сопоставленного содержимого в BASH_REMATCH[0], и любые сопоставляемые группы в BASH_REMATCH[1] и далее.

+0

Большое спасибо! это действительно помогло! – john

 Смежные вопросы

  • Нет связанных вопросов^_^