Это похоже на различие между Синтаксическим анализом и TryParse. Вы используете TryParse, когда Вы ожидаете, что он мог бы перестать работать, но когда у Вас будет сильное обеспечение, он не приведет Вас к сбою Синтаксический анализ использования.
My sed
(Mac OS X) didn Не работает с +
. Вместо этого я попробовал *
и добавил тег p
для вывода совпадений:
sed -n 's/^.*abc\([0-9]*\)xyz.*$/\1/p' example.txt
Для сопоставления хотя бы одного числового символа без +
я бы использовал:
sed -n 's/^.*abc\([0-9][0-9]*\)xyz.*$/\1/p' example.txt
Я использую perl
, чтобы облегчить себе задачу. например,
perl -ne 'print $1 if /.*abc([0-9]+)xyz.*/'
Это запускает Perl, опция -n
инструктирует Perl читать по одной строке из STDIN и выполнять код. Параметр -e
определяет инструкцию для выполнения.
Инструкция запускает регулярное выражение в прочитанной строке, и, если оно совпадает, выводит содержимое первого набора скобок ( $ 1
]).
Вы также можете сделать это с несколькими именами файлов в конце. например,
perl -ne 'print $ 1 if /.*abc([0-9 provided+)xyz.*/' example1.txt example2.txt
Если ваша версия grep
поддерживает его, вы можете использовать параметр -o
, чтобы вывести только часть любой строки, которая соответствует вашему регулярному выражению.
Если нет, то вот лучший sed
, который я мог придумать:
sed -e '/[0-9]/!d' -e 's/^[^0-9]*//' -e 's/[^0-9]*$//'
... который удаляет / пропускает без цифр, а для оставшихся строк удаляет все начальные и конечные нецифровые символы. (Я только предполагаю, что вы собираетесь извлечь число из каждой строки, содержащей его.)
Проблема с чем-то вроде:
sed -e 's/.*\([0-9]*\).*/&/'
.... или
sed -e 's/.*\([0-9]*\).*/\1/'
... в том, что sed
поддерживает только «жадное» совпадение ... поэтому первый. * будет соответствовать остальной части строки. Если мы не сможем использовать инвертированный символьный класс для достижения нежадного соответствия ... или версию sed
с Perl-совместимыми или другими расширениями его регулярных выражений, мы не сможем извлечь точное совпадение с образцом из с пространством образца (линия).
Проблема с чем-то вроде:
sed -e 's/.*\([0-9]*\).*/&/'
.... или
sed -e 's/.*\([0-9]*\).*/\1/'
... в том, что sed
] поддерживает только «жадное» совпадение ... поэтому первый. * будет соответствовать остальной части строки. Если мы не сможем использовать инвертированный символьный класс для достижения нежадного соответствия ... или версию sed
с Perl-совместимыми или другими расширениями его регулярных выражений, мы не сможем извлечь точное совпадение с образцом из с пространством образца (линия).
Проблема с чем-то вроде:
sed -e 's/.*\([0-9]*\).*/&/'
.... или
sed -e 's/.*\([0-9]*\).*/\1/'
... в том, что sed
] поддерживает только «жадное» совпадение ... поэтому первый. * будет соответствовать остальной части строки. Если мы не сможем использовать инвертированный символьный класс для достижения нежадного соответствия ... или версию sed
с Perl-совместимыми или другими расширениями его регулярных выражений, мы не сможем извлечь точное совпадение с образцом из с пространством образца (линия).
Если вы хотите выбрать строки, удалите те биты, которые вам не нужны:
egrep 'abc[0-9]+xyz' inputFile | sed -e 's/^.*abc//' -e 's/xyz.*$//'
Он в основном выбирает нужные строки с помощью egrep
, а затем использует ] sed
, чтобы удалить биты до и после числа.
Вы можете увидеть это в действии здесь:
pax> echo 'a
b
c
abc12345xyz
a
b
c' | egrep 'abc[0-9]+xyz' | sed -e 's/^.*abc//' -e 's/xyz.*$//'
12345
pax>
Обновление: очевидно, если ваша реальная ситуация более сложна, мне понадобятся RE изменен. Например, если у вас всегда было одно число, заключенное в ноль или более нечисловых чисел в начале и в конце:
egrep '[^0-9]*[0-9]+[^0-9]*$' inputFile | sed -e 's/^[^0-9]*//' -e 's/[^0-9]*$//'
Для awk. Я бы использовал следующий сценарий:
/.*abc([0-9]+)xyz.*/ {
print $0;
next;
}
{
/* default, do nothing */
}
вы можете сделать это с помощью оболочки
while read -r line
do
case "$line" in
*abc*[0-9]*xyz* )
t="${line##abc}"
echo "num is ${t%%xyz}";;
esac
done <"file"