Команды Mutiple после sudo в одной строке

Используя sed

Это позволит вывести только те строки, которые начинаются с положительного числа:

sed -n 's/^\([[:digit:]][^ ,]*\).*/\1/p'

В сочетании с одной из ваших линий, это будет выглядеть как:

h5totxt hsli0.126.h5 | harminv -vt 0.1 -w 2-3 -a 0.9 -f 200 | sed -n 's/^\([[:digit:]][^ ,]*\).*/\1/p'

Как это работает

  • -n

    Это говорит sed не печатать ни одну линию, если только мы явно не попросим об этом.

  • s/^\([[:digit:]][^ ,]*\).*/\1/p

    Это говорит sed искать строки, начинающиеся с положительного числа и выводить только это число.

    В регексе ^ совпадает только с началом строки. [[:цифра:]] совпадает с любой цифрой. [^ ,]* совпадает со всем, что следует за этой цифрой, кроме пробела или запятой. Все это сгруппировано в круглые скобки, так что позже мы сможем сослаться на число как \1. Затем вся строка заменяется номером, и с помощью опции p мы говорим sed распечатать его.

    Одна из них использовала [0-9] для совпадения цифр. С появлением юникодных шрифтов это больше не является надежным. Выражение [[:digit:]], однако, является юникодовым безопасным.

Альтернатива использованию расширенного regex

Если вы используете GNU sed (что верно для всех Linux-систем), то опция -r может быть использована для получения расширенных регулярных выражений. При использовании расширенного регекса, пары, используемые для группировки, не нужно экранировать:

sed -rn 's/^([[:digit:]][^ ,]*).*/\1/p'

На OSX или других системах BSD используйте -E вместо -r.

Использование awk

Это делает то же самое, но с использованием awk:

awk -F, '/^[[:digit:]]/{print $1}'

В сочетании с вашим конвейером:

h5totxt hsli0.126.h5 | harminv -vt 0.1 -w 2-3 -a 0.9 -f 200 | awk -F, '/^[[:digit:]]/{print $1}'
-1
25.03.2015, 01:23
1 ответ

Используйте отдельные цитаты, так как двойные кавычки делают $ вещи в первой оболочке

0
28.01.2020, 05:13

Теги

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