Найдите номер строки, который содержит шаблон, используя специальный разделитель регулярных выражений

Как в примере, я пытаюсь получить номера строк, которые содержат шаблон. Мой шаблон содержит слэши, поэтому я хотел добавить пользовательский разделитель.

Этот простой работает:

sed -n '/file/=' temp.txt 

Использование ограничителя для замены строк также работает:

 sed 's|file|gile|' temp.txt 

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

 sed -n '|file /etc|=' temp.txt 

Я знаю, что я могу избежать слэшей, но я бы предпочел добавить пользовательский разделитель. Любая идея, как исправить мою команду?

2 Solutions collect form web for “Найдите номер строки, который содержит шаблон, используя специальный разделитель регулярных выражений”

Стефан дал вам решение:

 sed -n '\|file /etc|=' file 

Если вы открыты для использования других инструментов, вы также можете

 grep -n 'file /etc' file 

Это также напечатает сама строка, чтобы получить только номер строки:

 grep -n 'file /etc' file | cut -d: -f 1 

Или вы можете использовать perl :

 perl -lne 'm|file /etc| && print $.' file 

Или awk :

 awk '$0 ~ "file /etc" {print NR}' 

Во всех контекстных адресах вы должны избегать открытия разделителя, если вы не используете значение по умолчанию / . Любые последующие вхождения, которые экранированы, рассматриваются как буквенный символ, а не как конечный разделитель.

  • разделитель по умолчанию:

     /start/,/end/{/pattern/d;} 
  • пользовательский разделитель:

     \#start#,\#end#{\#pattern#d;} 

См. Документы POSIX :

В контексте адреса конструкция \ cREc, где c – любой символ, отличный от символа обратной косой черты или символа новой строки, идентична / RE /. Если символ, обозначенный символом c, появляется после обратного слэша, тогда он считается тем буквальным символом, который не завершает RE. Например, в контексте address \ xabc \ xdefx второй x обозначает себя, так что регулярное выражение является abcxdef.

Подобное описание в странице sed man GNU sed man :

 /regexp/ Match lines matching the regular expression regexp. \cregexpc Match lines matching the regular expression regexp. The c may be any character. 

и sed man страница FreeBSD sed man :

 In a context address, any character other than a backslash (``\'') or newline character may be used to delimit the regular expression. The opening delimiter needs to be preceded by a backslash unless it is a slash. For example, the context address \xabcx is equivalent to /abc/. Also, putting a backslash character before the delimiting character within the regular expression causes the character to be treated literally. For example, in the context address \xabc\xdefx, the RE delimiter is an ``x'' and the second ``x'' stands for itself, so that the regular expression is ``abcxdef''. 
  • Измените известные слова 1 и 3 строки, сохраняя неизменное слово 2 постоянным
  • разделить файл на две части, по шаблону
  • Измените текст в теге, но только тег содержится в определенном блоке XML
  • grep + регулярное выражение для соответствия слову, расположенному перед последним словом
  • Как я могу упростить эту команду только для использования awk?
  • Печать строк с нечетными номерами, печать строк с четными номерами
  • sed, конвертировать одиночную обратную косую черту в двойную обратную косую черту
  • Редактируйте несколько строк из определенного раздела INI-файла
  • размещение кавычки после поиска строки
  • Убедитесь, что / etc / export содержит правило, используя bash
  • Bash при поиске цикла и замене с помощью sed
  • Linux и Unix - лучшая ОС в мире.