【问题标题】:Regex to replace |foo| with abs(foo) [closed]正则表达式替换 |foo|与 abs(foo) [关闭]
【发布时间】:2023-04-06 05:55:01
【问题描述】:

我有一个很大的 LaTeX 文档,我希望更改我使用绝对值表示法的地方的格式。理想情况下,我会自动执行此操作,但我不确定如何构建正则表达式来执行此操作。

我查看了这个网站上的其他问题,很多都涉及如何用 abs(foo) 替换 (foo),但问题是 '(' 和 ')' 是不同的字符,而开头和结束绝对值括号是相同的。

我在想我必须以某种方式计算“|”实例来查看是否有偶数或奇数发生。

我的工作假设是 |富 |酒吧 |巴兹 |总是转换为 abs(foo) bar abs(baz) 即没有嵌套。

有没有办法做到这一点?我用了一点grep,但是sed或者perl用的不多,所以我不清楚如何进行搜索和替换。

【问题讨论】:

  • 为什么你认为这比括号更难?尝试同样的事情,但用管道替换括号,看看它是否符合您的要求。
  • 是否有任何关于| 两侧是否存在空格的假设?例如,如果它是一个绝对值,那么|foo| 将在第一个 | 之前有一个空格,在第二个 | 之后有一个空格。而对于|foo|bar|baz| 甚至|foo|bar|(其语义与绝对值不同),您的正则表达式可以在第二个| 之后检查非空格,然后再将其称为abs。我知道我在这里做了一些假设......
  • 遗憾的是,我认为间距不够一致。

标签: regex replace sed grep full-text-search


【解决方案1】:

试试这个 sed 行:

sed -r 's/([^|]*)\|([^|]+)\|/\1abs(\2)/g' file.tex

注意

  • 我使用-r 来保存一些转义。

  • 这个替换是有风险的,你必须测试一下。因为 sed 在您的文本中不知道,哪种情况是绝对值表示法,哪种情况是逻辑或表示法,或按位“或”运算。如果你的文字有这些。

用你的例子:

kent$  echo " | foo | bar | baz |"|sed -r 's/([^|]*)\|([^|]+)\|/\1abs(\2)/g'                                                                                                
 abs( foo ) bar abs( baz )

【讨论】:

  • +1,但你不需要之前捕获的东西:'s/\|([^|]+)\|/abs(\1)/g'
  • 谢谢。是的,你的更好,我的正则表达式中的\1 是不必要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
相关资源
最近更新 更多