Использование awk для захвата только первого экземпляра регулярного выражения

Предполагая, что вы получаете суффиксы имен файлов в качестве отдельных аргументов командной строки (см. конец ответа, как работать со строкой, разделенной запятыми -):

#!/bin/sh

for suffix do
    set -- "$@" -o -iname "*.$suffix"
    shift
done

shift

find. -type f \( "$@" \)

Этот скрипт будет называться

./script.sh ksh cfg

и заменит каждый суффикс $suffixв позиционных параметрах на -o -iname "*.$suffix".

Единственный shiftперед вызовом findудаляет начальный -oв "$@".

Использование массивов в ksh93илиbash:

#!/bin/ksh

name_opts=()

for suffix do
    name_opts+=( -o -iname "*.$suffix" )
done

find. -type f \( "${name_opts[@]:1}" \)

:1в "${name_opts[@]:1}"отбрасывает первый элемент массива name_opts(начального-o).


Если вы действительно хотите получить суффиксы в виде строки -с разделителями-запятыми (, что означает, что вы не можете использовать сценарий для поиска файлов с запятыми в суффиксах имен файлов, таких как файлы в хранилище RCS или CVS. ), вы можете преобразовать эту строку $listв массив в bashили ksh93с

set -f
suffixes=( ${list//,/ } )
set +f

или в shс

set -f
set -- $( printf '%s\n' "$list" | tr ',' ' ' )
set +f

или

set -f; ifs=$IFS; IFS=','
set -- $list
set +f; IFS=$ifs; unset ifs

(они устанавливают позиционные параметры в список суффиксов ).

set -fотключает генерацию имени файла (подстановку ), так как мы полагаемся на оболочку для разделения строки на пробелы, которыми мы заменяем запятые, но чтобы не использовать сгенерированный слова для globbing. Без set -fмы не смогли бы правильно обработать запрос суффиксов, таких как [ch]или *.

Цикл в bashили kshизменится с

for suffix do...

-

for suffix in "${suffixes[@]}"; do...

, а петля в shостанется как есть.

0
19.01.2021, 20:17
2 ответа

Используйте операторnextfile:

awk '/Dipole Moment: \[D\]/{found=1;next} found{print $NF;nextfile;}' *.txt
1
18.03.2021, 22:36

Gnu sed может сделать следующее:

sed -ns '
  /^Dipole Moment: \[D]/!d
  $!N;/\n/s/.* //p;:n;n;bn
'./*.txt
  • -sопция (nonPosix )для обработки файлов как отдельных потоков.
  • -nзапрещает печать пространства шаблонов по умолчанию перед выборкой следующей записи.
  • После линии дипольного момента мы прикрепляем следующую линию к пространству узора.
  • Удалить до последнего пробела (при условии отсутствия завершающих пробелов )печатается последнее поле, т. е. значение дипольного момента.
  • затем мы перемещаемся в конец текущего файла. Весь процесс повторяется для следующего файла.
0
18.03.2021, 22:36

Теги

Похожие вопросы