使用自定义正则表达式分隔符查找包含模式的行号

使用自定义正则表达式分隔符查找包含模式的行号

如在例子我正在尝试获取包含模式的行号。我的模式包含斜杠,因此我想添加自定义分隔符。

这个简单的方法有效:

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

使用分隔符进行字符串替换也有效:

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

但是当我想在第一个示例中添加分隔符时,它没有:

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

我知道我可以转义斜杠,但我更愿意添加自定义分隔符。知道如何修复我的命令吗?

答案1

史蒂芬给你解决方案sed

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}'

答案2

在所有上下文地址中,你都必须转义开幕分隔符,除非您使用默认的/.任何后续出现的转义字符均被视为文字字符,而不是结束分隔符。

  • 默认分隔符:

    /start/,/end/{/pattern/d;}
    
  • 自定义分隔符:

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

请参阅POSIX 文档:

在上下文地址中,结构 \cREc(其中 c 是除反斜杠或换行符之外的任何字符)与 /RE/ 相同。如果 c 指定的字符出现在反斜杠后面,则它被认为是该文字字符,不终止 RE。例如,在上下文地址\xabc\xdefx中,第二个x代表其自身,因此正则表达式为abcxdef。

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.

和 FreeBSDsed 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''.

相关内容