Можно ли написать оператор grep в несколько строк?

Когда у меня возникла эта проблема, она была вызвана тем, что старые сеансы задерживались и вызывали проблемы. Попробуйте tmux lsи посмотрите, найдете ли вы что-нибудь. Вы можете повторно подключиться к старому сеансу с помощью tmux -S <session>---, это сработало для меня, хотя обычный tmuxне смог начать новый сеанс.

Вы также можете закрыть все сеансы с помощью tmux ls -F "#S" | xargs -n 1 tmux kill-session, чтобы получить список сеансов по именам и закрыть их автоматически. (Обязательно сначала проверьте эти сеансы, иначе вы можете потерять информацию!)

8
20.08.2020, 07:01
3 ответа

Не вижу там необходимости в |. Вы можете использовать несколько -eопций, разбросанных по строкам:

grep -e foo \
     -e bar \
     -e barz
11
18.03.2021, 23:11

Аргумент шаблона на самом деле представляет собой список шаблонов, разделенных символами новой строки. Это верно даже для grep -F:, вы можете искать несколько строк. Так что вы можете написать:

grep 'foo
bar
barz'

Но обратите внимание, что строки продолжения не должны иметь отступ :любой начальный пробел будет частью шаблона. По этой причине вы можете предпочесть передавать список шаблонов в виде отдельных аргументов с -eперед каждым шаблоном. Затем вы можете использовать \в конце строки, чтобы разделить команду оболочки между строками между аргументами команды grep. Два синтаксиса эквивалентны.

grep -e 'foo' \
     -e 'bar' \
     -e 'barz'

Обратите внимание, что ни одна из них не работает с текущими версиями GNU grepпри передаче опции -P(для регулярных выражений PCRE ), которая в этих случаях не работает с grep: the -P option only supports a single pattern. Однако вы можете использовать pcregrepвместо GNU grep -Pи использовать флаг xдля ввода многострочных -регулярных выражений строки:

pcregrep '(?x)
  foo |
  bar |
  barz'

При использовании (?x)все пробельные символы, включая SPC и NL, игнорируются, что позволяет вам делать отступы в коде по своему усмотрению.

12
18.03.2021, 23:11

с использованием Raku (, ранее известного как Perl _6)

$ cat foo_bar_barz.txt | raku -ne '.grep(/
| foo
| bar
| barz
/).put;'

#выходы:

1. foo
2. bar
3. barz

Одной из основных причин для Perl6 (теперь проекта Raku )было переписать механизм регулярных выражений, чтобы можно было вводить более читаемый код. Настройки Raku по умолчанию включают в себя возможность вставлять пробелы между токенами, записывать регулярные выражения в несколько строк, а также пересмотр системы «модификаторов» (, которая теперь называется «наречиями» ). [В качестве примера последнего, где вы использовали тег «g» в конце регулярного выражения, теперь, когда «:g» появляется в начале регулярного выражения, чтобы вы знали, что вы пытаетесь сопоставить с получить -идти].

Выше приведено решение Raku для приведенного вами примера. Обратите внимание, что в Raku оператор чередования |реализует самую длинную -токен -, соответствующую стратегии (LTM ). Также вы можете свободно вставлять «ведущий» |оператор чередования, чтобы помочь вам выстроить токены (см. выше ). Раку принимает это как обычное дело.

Ниже, чтобы дать вам представление о том, что происходит за кулисами, я захватываю три токена по отдельности, используя оператор сопоставления m//вместо grep(). Захваты выполняются с помощью круглых скобок,с нумерацией, начинающейся с$0:

$ cat foo_bar_barz.txt | raku -ne 'say  m/
| (foo)
| (bar)
| (barz)
/;'

#выходы:

「foo」
 0 => 「foo」
「bar」
 0 => 「bar」
「barz」
 0 => 「barz」
Nil

Обратите внимание, что входной файл выглядит следующим образом: (с фиктивной строкой в ​​конце, чтобы быть честным):

$ cat foo_bar_barz.txt
1. foo
2. bar
3. barz
4. ziggy

https://raku.org/

1
18.03.2021, 23:11

Теги

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