将行首与那里的某些内容匹配?

将行首与那里的某些内容匹配?

我想匹配包含某些内容的行的开头。

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$\$\$/

相关内容