исключение символа перед определенным символом в sed

Если у вас есть реализация cron, которая вообще документирует файл crontab, вы должны использовать исторический вариант UNIX. Уже более 30 лет единственным допустимым интерфейсом к утилите cronявляется команда crontab.

Это причина, по которой POSIXвообще не документирует утилиту cron, так как это деталь, специфичная для реализации.

Так что ведите себя корректно и используйте crontab -lтолько для просмотра crontabs или crontab -eдля редактирования crontabs.

Если вы редактируете файл crontab, команда crontabзатем сохраняет файл crontab в определенном системном месте и информирует утилиту cronо том, что файл crontab был изменен и его необходимо перечитать.

0
21.01.2017, 05:04
4 ответа
$ sed -r 's/.* ([^ ]+\.[^ ]+).* ([^ ]+)$/\1 \2/' orange
orange.5678 you

Объяснение

  • -r использовать расширенные регулярные выражения
  • s / old / new replace old с новым
  • .* любое количество любых символов
  • (некоторые символы) за исключением некоторых символов для ссылки позже при замене
  • [^] + некоторые символы, не являющиеся пробелом
  • \. буквальная точка
  • $ конец строки
  • \ 1 обратная ссылка на сохраненный шаблон

, поэтому s /.* ([^] + \. [^] +) . * ([^] +) $ / \ 1 \ 2 / означает соответствие чему-либо в строке вплоть до пробела, предшествующего некоторым непробельным символам до . , а затем несколько непробельных символов после него (сохраняя эти символы по обе стороны от . ), затем сопоставьте любые символы и сохраните последний набор непробельных символов в строке и замените весь совпадают с двумя сохраненными шаблонами, разделенными пробелом

7
28.01.2020, 02:13

Надо посмотреть другой ответ @Zanna. Очень элегантно и демонстрирует всю мощь регулярных выражений.

Попробуйте это выражение с gawk . Обычная awk не работает с группировкой.

^(?:\w+\s){0,}(\w+\.\w+)(?:\s\w+){0,}\s(\w+)$

Это работало для следующих вариантов

apple orange.5678 dog cat 009 you
apple apple grape.9991 pig cat piegon owl
grape.9991 pig cat piegon owl

Вот описание выражения.

/
^(?:\w+\s){0,}(\w+\.\w+)(?:\s\w+){0,}\s(\w+)$
/
g
^ asserts position at start of the string

Non-capturing group (?:\w+\s){0,}
{0,} Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy)
\w+ matches any word character (equal to [a-zA-Z0-9_])
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
\s matches any whitespace character (equal to [\r\n\t\f\v ])

1st Capturing Group (\w+\.\w+)
\w+ matches any word character (equal to [a-zA-Z0-9_])
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
\. matches the character . literally (case sensitive)
\w+ matches any word character (equal to [a-zA-Z0-9_])
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)

Non-capturing group (?:\s\w+){0,}
{0,} Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy)
\s matches any whitespace character (equal to [\r\n\t\f\v ])
\w+ matches any word character (equal to [a-zA-Z0-9_])
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
\s matches any whitespace character (equal to [\r\n\t\f\v ])

2nd Capturing Group (\w+)
\w+ matches any word character (equal to [a-zA-Z0-9_])
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
$ asserts position at the end of the string, or before the line terminator right at the end of the string (if any)
1
28.01.2020, 02:13

Самый простой подход:

awk '{print $2, $6}' file.txt

Если ваш фактический вариант использования более сложен, чем указывает ваш вопрос, и вам требуется дополнительная логика (например, если это не , всегда 2-е и 6-е поля, которые вам нужны), отредактируйте свой вопрос , чтобы уточнить.

4
28.01.2020, 02:13

Если необходимо выполнить команду sed с регулярным выражением, то приведенный выше ответ покроет вас. Если вы открыты для альтернатив:

gv@debian: $ read -r a b c d e f<<<"apple orange.5678 dog cat 009 you" && echo "$b $f" 
orange.5678 you

Если это строка в файле, замените <<< ". ... " with

Для работы этого метода требуется IFS = пробел по умолчанию. Если в doube, примените IFS = "" в начале.

0
28.01.2020, 02:13

Теги

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