是否有一个bash脚本可用于在两个给定表达式之间查找特定字符?

时间:2019-09-05 15:00:41

标签: regex bash sed grep

我有3个步骤的问题:我需要

  1. 在乳胶文件中找到字符:的所有出现位置,但仅当它出现在\ref{}\label{}中时,是其他字符。示例:The system's total energy (\ref{eq:E}).
  2. :替换那些_。示例变为:The system's total energy (\ref{eq_E}).
  3. 对引用或标签中:中出现的所有此类\ref{文件进行此操作,

我以前从未做过。我已经确定可以使用正则表达式查找复杂的事件。我可以在\label{中找到(\\ref\{|\\label\{)content = ["[['a','b','c'],['a','b1','c2'],['a2','b2','c']]\n", '[[\'Spain\',\'name\',\'"Spain"\'],[\'Spain\',\'capital\',\'Madrid\'], [\'Madrid\',\'a\',\'Capital\']] \n', '[[\'Spain\',\'name\',\'"Spain"\'], [\'Spain\',\'capital\',\'Madrid\'], [\'Madrid\',\'a\',\'Capital\'],[\'Capital\',\'a\',\'City\'], [\'Spain\',\'neighbours\',\'France\'],[\'Spain\',\'a\',\'Country\']] \n'] ,但是由于它的宽度不是固定的,所以无法将其放到后面。我的前瞻性和前瞻性的另一个问题是,我只能匹配断言之间的所有内容,而不能匹配特定字符(根据我的理解)。

我还得出结论,可以使用sed查找和替换。我打算使用正则表达式作为sed“查找”。这有道理吗?

最后,我不确定如何在我的所有文件(具有顺序名称)上循环。我可以在bash脚本中执行if或while循环吗?

我知道我的问题到处都是,就像我说的那样,以前从来没有做过,而且有大量的文档我才刚刚开始解决。任何帮助或指示,将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以使用以下命令,该命令依赖于捕获组来提取引用或包含冒号的标签的不同部分,以使用下划线将其替换为等价的内容:

sed -E 's/\\(ref|label)\{([^:]*):([^}]*)}/\\\1\{\2_\3}/g'

表达式将捕获整个ref或label标记,与第一个捕获组中的标记名匹配,第二个捕获组中的冒号之前的部分,以及第三个捕获组中的冒号之后的部分,与之匹配。替换模式使用对这些捕获组的引用,可以读取为\<tagName>{<before colon>_<after colon>}

您可以try it here

请注意,最好使用能够理解乳胶格式的解析器,在某些情况下,正则表达式可能会失败。

  

最后,我不确定如何在我的所有文件(具有顺序名称)上循环。我可以在bash脚本中执行if或while循环吗?

sed接受文件列表作为参数,并将其命令应用于所有文件。文件列表可以通过扩展glob来产生,例如sed 'sedCommand' /your/directory/*.txt适用于名称以/your/directory/结尾的.txt的所有文件。

在这种情况下,您可能需要使用sed的{​​{1}}“就地”标志,该标志要求-i将结果直接写入目标文件而不是标准文件中输出。如果要备份原始文件,则可以在该标志后加上后缀,例如sed将使sed -i.bak 'command' file.txt包含结果,而file.txt将包含原始结果。