Извлечение строки с помощью grep regex assertions

tempd=$(mktemp -d)
for f in ./*.csv
do
   < "$f" \
       sed -e '1y/\t-/ _/; 1!s/.*/[&]/' |
       dc -e '
       [q]sq
       [?z0=q pc z0=?]s? # macro "?" to print line
       ?r2/ n32anpc l?x  # 1st line div/2 the last stack elem print it+spc+2nd
      ' \
   > "$tempd/$f"
   mv "$tempd/$f" .
done
rm -r "$tempd"
0
29.06.2017, 17:12
3 ответа

Если только строка, которую вы хотите извлечь, не содержит ;, проще всего заменить . (соответствует любому одиночному символу) с [^;](соответствует любому символу, кроме ;)

$ printf '%s\n' "$my_string" | grep -oP '(?<='baz=')[^;]*'
222

С grep, связанным с libpcre 7.2 или новее, вы также можете упростить просмотр назад, используя форму \K:

$ printf '%s\n' "$my_string" | grep -oP 'baz=\K[^;]*'
222

Они будут печатать все вхождения в строке и предполагать, что соответствующий текст не содержит символов новой строки (поскольку grepобрабатывает каждую строку ввода отдельно).

3
28.01.2020, 02:19

Ответ Steeldriver точен, но у меня проблемы с просмотром вперед/назад, и я бы сделал это так для удобочитаемости (сbash):

my_string="foo bar=1ab baz=222;"
regex='baz=([0-9]+);'
[[ $my_string =~ $regex ]] &&
  echo "${BASH_REMATCH[1]}"
1
28.01.2020, 02:19

Также просто сsed:

sed -n 's/.*baz=\([^;]*\).*/\1/p' <<< $my_string
222
0
28.01.2020, 02:19

Теги

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