
хотите найти строку и нужна часть строки
файл.txt:
CREATE MULTISET TABLE $$ENV$$_TEMP_ESM.EMPASGMTAMPTMPRTRSE, NO FALLBACK ,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT,
DEFAULT MERGEBLOCKADSRATIO
при использовании команды ниже sed
получаем дополнительное значение
Выход:
bash-4.3$ sed -n 's/.*$$ENV$$_//p' file.txt
**TEMP_ESM.EMPASGMTAMPTMPRTRSE** ,NO FALLBACK ,
Мне нужно толькоTEMP_ESM.EMPASGMTAMPTMPRTRSE
решение1
sed -n 's/.*$$ENV$$_//p' example.txt
Команда s/pattern/replacement/
ищет sed
все строки на наличие регулярного выражения pattern
и заменяет его. При пустой замене шаблон удаляется, что, кажется, то, что вам нужно.
Конечный p
вывод выводит измененную строку, в то время как весь вывод по умолчанию подавляется опцией -n
.
решение2
С GNU grep
, если он собран с (новой) поддержкой PCRE (как это часто бывает в системах GNU и BSD):
grep -Po '\Q$$ENV$$_\E\K[^\s,]+' < file
извлечет все последовательности символов, кроме пробелов и запятых, которые следуют за каждым вхождением $$ENV$$_
.
Если GNU grep
недоступен, то же самое можно сделать с помощью perl
( P
в PCRE):
perl -lne 'print for /\$\$ENV\$\$_\K[^\s,]+/g' < file
Или если perl
версия слишком старая для поддержки \K
:
perl -lne 'print for /\$\$ENV\$\$_([^\s,]+)/g' < file
решение3
sed
подход:
sed -n 's/^CREATE.*$_\([^[:space:],]*\).*/\1/p' file
\([^[:space:],]*\)
- 1-я захваченная группа, содержащая символы, за исключением пробелов[:space:]
и запятых,
Выход:
TEMP_ESM.EMPASGMTAMPTMPRTRSE
решение4
sed '/.*$$ENV$$_/!d;s///;s/,.*//'
/.*$$ENV$$_/!d
: Если строка не содержит$$ENV$$_
, вывод не производится, дальнейшая обработка не производитсяs///
: удалить соответствующий шаблонs/,.*//
: удалить запятую и все, что после