我想匹配包含某些内容的行的开头。
Perl/Sed 中的命令
's/^.?/\section{}/g'
但这里的问题是它也替换了句子的第一个字符。
如何在行首添加非空行的内容?
答案1
sed '/./s/^/\\section{}/'
将添加\section{}
到至少包含一个的每一行有效的特点。
sed '/^$/!s/^/\\section{}/'
将添加\section{}
到每个非空行(即至少包含一个字节)。
sed 's/./\\section{}&/'
\section{}
将在每行中的第一个有效字符(具有此类有效字符)之前插入。 (&
被匹配部分替换)。
之间的那些区别字节和特点如果您处于每个字符多字节的语言环境(例如如今已成为常态的 UTF-8)但处理以扩展单字节字符集编码的文本,则可能会很有意义。
例如:
$ locale charmap
UTF-8
$ echo Москва | iconv -t iso-8859-5 | sed 's/./\\section{}&/' | iconv -f iso-8859-5
Москва
(以 iso-8859-5 编码时,Москва 的结果字节值均不会形成 UTF-8 中的有效字符,因此/./
不匹配任何内容)。
由于在您的情况下,编码不会成为问题,因为您插入的文本无论如何都是 ASCII,您可以将语言环境修复为 C 以避免意外:
$ echo Москва | iconv -t iso-8859-5 | LC_ALL=C sed 's/./\\section{}&/' | iconv -f iso-8859-5
\section{}Москва
答案2
您可以用两个语句来完成此操作sed
:第一个语句确保没有空行匹配,第二个语句附加在开头:
sed '/^$/n;s/^/\\section{}/'
或者,您可以通过捕获匹配的内容并将其添加到替换内容中,在一条语句中完成此操作:
sed 's/^\(.\)/\\section{}\1/'
这里,括号\(
和定义了语句的替换部分中\)
引用的捕获组。\1
?
另请注意,为了确保该行不为空,您需要删除点后面的问号.
。?
表示“0 或 1”,因此空行将匹配 0 长度。
答案3
使用零宽度正前瞻断言:
perl -pe 's/^(?=.)/\section{}/'
perlre
说:
(?=pattern)
零宽度正前瞻断言。例如,/\w+(?=\t)/
匹配一个单词后跟一个制表符,但不包含制表符$&
另一个解决方案:
perl -lpe 's/^/\section{}/ if length'
在检查长度之前,您应该\n
在行尾进行咀嚼。
该-l
选项为您做这件事。
-l[octnum]
启用自动换行处理。它有两种不同的效果。首先,当与或$/
一起使用时,它会自动切掉(输入记录分隔符)。其次,它指定(输出记录分隔符)具有 octnum 值,以便任何打印语句都将重新添加该分隔符。如果省略 octnum,则设置为当前值-n
-p
$\
$\
$/