Вы ищете что-то вроде tar --owner = 0 --group = 0
, чтобы установить все, что принадлежит корень
/ корень
.
как насчет этих sed и grep
$ sed "s/\([0-9]\)/\n\1\n/" input.txt | grep "^.$"
1
4
5
7
Вы можете попробовать следующее:
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
Я подозреваю, что это своего рода упражнение, осваивающее только 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
Вывод желаемого результата.
Разрешено ли вам использовать 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
Вы можете использовать два 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'