我有3个步骤的问题:我需要
:
的所有出现位置,但仅当它出现在\ref{}
或\label{}
中时,是其他字符。示例:The system's total energy (\ref{eq:E}).
:
替换那些_
。示例变为:The system's total energy (\ref{eq_E}).
:
中出现的所有此类\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循环吗?
我知道我的问题到处都是,就像我说的那样,以前从来没有做过,而且有大量的文档我才刚刚开始解决。任何帮助或指示,将不胜感激。
答案 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
将包含原始结果。