sed вопрос о совпадении пробелов

Если значения умещаются в памяти, что ваше «до 500» должно, и в зависимости от того, что именно вы хотите, awk , вероятно, сможет сделать это за один проход и (по крайней мере, в большинстве случаев) за один процесс.

Чтобы перечислить все без исключения значения, которые встречаются один раз, в произвольном порядке, если их больше одного:

awk '!n[$2++]{a[$2]=$1} END{for(v in n)if(n[v]==1)print a[v],v}'
# can pipe output to a suitable sort if you want a specific order
# or for GNU awk 4, you can get several non-arbitrary orders
# (less than GNU sort) using PROCINFO["sorted_in"] see the manual

Чтобы перечислить одно значение, которое встречается один раз, если есть хотя бы одно:

awk '!n[$2++]{a[$2]=$1} END{for(v in n)if(n[v]==1){print a[v],v;exit}}'

Чтобы перечислить одно значение, которое встречается один раз и в противном случае указывает, что их нет:

awk '!n[$2++]{a[$2]=$1} END{for(v in n)if(n[v]==1){print a[v],v;exit};print "no unique entry"}'
1
28.08.2017, 17:37
3 ответа

Используйте следующее выражениеsed:

sed 's/^\(xfirst[[:space:]]*=[[:space:]]*\).*/\1-180/' file

  • \1-указывает на 1-ю захваченную группу (т.е.(xfirst....))
1
27.01.2020, 23:18

Вы забыли заключить в кавычки оператор glob [[:space:]]и используете такую ​​оболочку, как csh, tcsh, fish(, хотя fishне поддерживает [...]операторы glob ), zsh,bash -O failglob(скорее всего (t)cshучитывая сообщение об ошибке )о том, что (правильно )не удается выполнить команду, когда глобус не совпадает.

tcshне распознает [:space:]классы символов POSIX, но этот s/=[[:space:]]0/-180/по-прежнему распознается как глобус.

После mkdir -p 's/=a]0/-180'глобус будет совпадать. Это s/=[[:space:]]0/-180/будет расширено до s/=a]0/-180/, и вы не получите ошибку No match.

Вместо этого здесь вы хотите процитировать это, чтобы оболочка не рассматривала его как шаблон глобуса и передала строку буквально в sed.

(Здесь я также добавляю отсутствующий *, чтобы разрешить 0 или более символов пробела в шаблоне, и отсутствующий =в качестве замены):

sed 's/=[[:space:]]*0/=-180/'

Или сохранить исходный интервал:

sed 's/\(=[[:space:]]*\)0/\1-180/'
2
27.01.2020, 23:18

Другой sedкомандный подход.

sed '/^xfirst/ s/\d\+/-180/'

или так.

sed '/^xfirst/ s/[0-9]+/-180/'

или просто замените 0на-180

    sed '/^xfirst/ s/0/-180/'
1
27.01.2020, 23:18

Теги

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