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"
Если только строка, которую вы хотите извлечь, не содержит ;
, проще всего заменить .
(соответствует любому одиночному символу) с [^;]
(соответствует любому символу, кроме ;
)
$ 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
обрабатывает каждую строку ввода отдельно).
Ответ Steeldriver точен, но у меня проблемы с просмотром вперед/назад, и я бы сделал это так для удобочитаемости (сbash
):
my_string="foo bar=1ab baz=222;"
regex='baz=([0-9]+);'
[[ $my_string =~ $regex ]] &&
echo "${BASH_REMATCH[1]}"
Также просто сsed:
sed -n 's/.*baz=\([^;]*\).*/\1/p' <<< $my_string
222