Получить первое сопоставление с образцом в строке без использования cut

Вы ищете что-то вроде tar --owner = 0 --group = 0 , чтобы установить все, что принадлежит корень / корень .

3
14.12.2016, 11:48
5 ответов

как насчет этих sed и grep

$ sed "s/\([0-9]\)/\n\1\n/" input.txt | grep "^.$"
1
4
5
7
1
27.01.2020, 21:10

Вы можете попробовать следующее:

grep -Eon ' [0-9]{1}' | sort -k1,1 -u

Вывод будет следующим (не уверен, что номера строк являются ограничителями):

1: 1
2: 4
3: 5
4: 7

Альтернативно это выражение даст вам желаемый вывод:

grep -Eon ' [0-9]{1}' | sort -k1,1 -u | grep -o ' .*'

Вывод (ваш образец вывода включает ведущие пробелы):

 1
 4
 5
 7
1
27.01.2020, 21:10

Я подозреваю, что это своего рода упражнение, осваивающее только grep. Чистое решение grep следующее:

В одной строке:

echo "first 1 is the real 2 time the word matched 3 " |grep -Eo '[0-9]' |grep -m1 -E '[0-9]'

К сожалению, использование grep -m1 в первом grep не дает нужного результата.

В файле с большим количеством строк нужно использовать цикл:

while read -r line; do
grep -Eo '[0-9]' <<<"$line" |grep -m1 -E '[0-9]'
done < file.txt

Или в одной командной строке:

while read -r line; do grep -Eo '[0-9]' <<<"$line" |grep -m1 -E '[0-9]';done < a.txt

Вывод желаемого результата.

3
27.01.2020, 21:10

Разрешено ли вам использовать sed ?

$ sed 's/[^[[:digit:]]*\([[:digit:]]\).*/\1/' << EOF
> first 1 is the real 2 time the word matched 3 
> appeared on the previous line but is 4 the fourth.
> Every line can have more numbers 5 because numbers 6 are everywhere
> I need to extract the number just after the word 7 that precedes 8
> EOF
1
4
5
7
2
27.01.2020, 21:10

Вы можете использовать два grep , сначала сопоставляя и возвращая все до первой последовательности десятичных цифр, затем сопоставляя и возвращая только цифры:

grep -Eo '^[^0-9]*[0-9]{1,}' file | grep -Eo '[0-9]{1,}'
{{1} }

[ПРИМЕЧАНИЕ: я использую {1,} , поскольку AFAIK {1} является избыточным, и я предполагаю, что вы хотите сопоставить десятичные последовательности.]

Если вам разрешено использовать режим PCRE и ваш grep поддерживает его, вы можете эффективно сделать то же самое в одном grep , используя \ K ] утверждение просмотра назад переменной ширины:

grep -Po '^[^0-9]*\K[0-9]+' file

или (немного более компактно, используя стиль Perl \ d для десятичной цифры):

grep -Po '^[^\d]*\K\d+' file

Или, поскольку вы не скажем, вам не разрешено использовать сам perl , вы можете разбить его на поля, разделенные пробелами, а затем найти первое поле, состоящее из цифр:

perl -MList::Util=first -alne 'print first { /^\d+$/ } @F'
​​
2
27.01.2020, 21:10

Теги

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