regex - Sed 动态反向引用替换

标签 regex bash unix sed awk

我正在尝试使用 sed 将 wiki 文本转换为 latex 代码。我快完成了,但我想自动生成图形标签,如下所示:

[[Image(mypicture.png)]]

...进入:

\includegraphics{mypicture.png}\label{img-1}

对于我想继续使用 sed 的事情。我当前使用的正则表达式和 bash 代码如下:

__tex_includegraphics="\\\\includegraphics[width=0.95\\\\textwidth]{$__images_dir\/"
__tex_figure_pre="\\\\begin{figure}[H]\\\\centering$__tex_includegraphics"
__tex_figure_post="}\\\\label{img-$__images_counter}\\\\end{figure}"

sed -e "s/\[\[Image(\([^)]*\))\]\].*/$__tex_figure_pre\1$__tex_figure_post/g"\

...但我无法增加该计数器。有什么想法吗?

从更一般的角度来看,我的问题如下:我可以在 sed 中使用反向引用来创建对于 sed 的每个匹配都不同的替换吗?这是,每次sed匹配模式时,我可以使用\1作为函数的输入并使用这个函数的结果作为替换吗?

我知道这是一个棘手的问题,我可能必须使用 AWK 来解决这个问题。但是,如果有人有解决方案,我将不胜感激他或她的帮助。

最佳答案

这可能对你有用(GNU sed):

sed -r ':a;/'"$PATTERN"'/{x;/./s/.*/echo $((&+1))/e;/./!s/^/1/;x;G;s/'"$PATTERN"'(.*)\n(.*)/'"$PRE"'\2'"$POST"'\1/;ba}' file

这会查找 shell 变量中包含的 PATTERN,如果不存在则打印当前行。如果存在该模式,则它会递增或启动保留空间中的计数器,然后将所述计数器附加到当前行。然后使用 shell 变量 PRE 和 POST 以及计数器替换该模式。最后,检查当前行是否存在该模式的进一步情况,并在必要时重复该过程。

关于regex - Sed 动态反向引用替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19203447/

相关文章:

linux - 如何使用shell脚本创建多个目录

python - 如何在Python IDLE替换对话框中准确找到 "\n"?

c# - 正则表达式以任意顺序捕获组

bash - 将输入字段作为数组循环

php - 从 PHP 执行的 Bash 脚本实时输出

unix - 规范与非规范终端输入

java - 如何只替换部分匹配的子串?

regex - 如何拉出每个逗号、连字符、下划线、空格,并在没有空格的情况下加入剩余的单词?

bash - 如何检查bash脚本中参数的长度

shell - 如何在 Unix 中 grep 包含超过 1 个单词的行