Regex将用abs(foo)取代| foo |

Regex将用abs(foo)取代| foo |,regex,replace,sed,grep,full-text-search,Regex,Replace,Sed,Grep,Full Text Search,我有一个很大的LaTeX文档,我希望更改使用绝对值表示法的地方的格式。理想情况下,我会自动执行此操作,但我不确定如何构造正则表达式来执行此操作 我在这个网站上看到了其他问题,很多问题都是关于如何用abs(foo)替换(foo),但问题是,“(”和“)”是不同的字符,而开头和结尾的绝对值括号是相同的 我在想,我必须以某种方式计算“|”实例,看看是否有偶数或奇数出现 我的工作假设| foo | bar | baz |总是转换为abs(foo)bar abs(baz),即没有嵌套 有办法做到这一点吗?

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

我在这个网站上看到了其他问题,很多问题都是关于如何用abs(foo)替换(foo),但问题是,“(”和“)”是不同的字符,而开头和结尾的绝对值括号是相同的

我在想,我必须以某种方式计算“|”实例,看看是否有偶数或奇数出现

我的工作假设| foo | bar | baz |总是转换为abs(foo)bar abs(baz),即没有嵌套

有办法做到这一点吗?我使用了一点grep,但没有太多sed或perl,因此我不清楚如何进行搜索和替换。

试试这句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 )
试试这句话:

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 )

为什么你认为这比括号难?尝试同样的方法,但是用管道替换paren,看看它是否符合您的要求。是否有关于
|
两侧是否存在空格的假设?例如,如果它是一个绝对值,那么
|foo |
将在第一个
|
之前有一个空格,在第二个
|
之后有一个空格。然而,使用
|foo | bar | baz |
甚至
|foo | bar |
(其语义含义与绝对值不同),您的正则表达式可以在调用
abs之前检查第二个
后面的非空格。我知道我在这里做了一些假设…遗憾的是,我认为间距不够一致,无法做到这一点。为什么你认为这比括号更难?尝试同样的方法,但是用管道替换paren,看看它是否符合您的要求。是否有关于
|
两侧是否存在空格的假设?例如,如果它是一个绝对值,那么
|foo |
将在第一个
|
之前有一个空格,在第二个
|
之后有一个空格。然而,使用
|foo | bar | baz |
甚至
|foo | bar |
(其语义含义与绝对值不同),您的正则表达式可以在调用
abs之前检查第二个
后面的非空格。我知道我在这里做了一些假设……遗憾的是,我认为间距不够一致,无法做到这一点。+1,但您不需要在之前捕获这些内容:
's/\\\\\\\([^\]+)\\\\\\\\/abs(\1)/g'
Thx。是的,你的更好,我的正则表达式中的
\1
是不必要的。+1,但是你不需要在以下时间之前捕获内容:
's/\\\\\\\([^\]+)\\\\\\\\\\/abs(\1)/g'
Thx。是的,您的更好,我的正则表达式中的
\1
不是必需的。