如在例子我正在尝试获取包含模式的行号。我的模式包含斜杠,因此我想添加自定义分隔符。
这个简单的方法有效:
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''.