我有一个充满以下条目的文件,类似于以下内容:
`\index{a!b!c} \index{small!medium!large} \index{mouse!dog!elephant}`
我需要一个脚本来更改所有这些,以便:
\index{c!b!a} \index{large!medium!small} \index{elephant!dog!mouse}
基本上发生的事情是,我为 LaTex 文件创建了索引条目,并且我向后得到了索引条目的顺序。必须有一个脚本可以解决这个问题。有人有什么想法吗?
答案1
您可以通过以下方式执行此操作Perl
:
perl -lpe 's|\\index\{\K.*?(?=\})|join "!", reverse split "!", $&|eg'
简要说明 :
- 将其所在位置左侧的部分
\index{
以及最靠近右侧}
的部分选择到捕获括号中。 - 用 bang 分割,重新排列分割的部分,然后用 bang 重新连接。
- 在线路上重复此操作多次,找到这样的组合。
答案2
您可以尝试awk
如下:
echo '\index{a!b!c} \index{small!medium!large} \index{mouse!dog!elephant}' | awk '{ print gensub(/\{([^!]*)!([^!]*)!([^!]*)\}/,"{\\3!\\2!\\1}", "g") }'
\index{c!b!a} \index{large!medium!small} \index{elephant!dog!mouse}
或者perl
perl -n -p -e ' s#(\\index\{)([^!]+)\!([^!]+)\!([^!]+)\}#$1$4\!$3\!$2\}#g'
\index{c!b!a} \index{large!medium!small} \index{elephant!dog!mouse}
答案3
sed -E 's/\{([^!]*)!([^!]*)!([^}]*)}/{\3!\2!\1\}/g'
例子:
$ var='\index{a!b!c} \index{small!medium!large} \index{mouse!dog!elephant}'
$ echo "$var" | sed -E 's/\{([^!]*)!([^!]*)!([^}]*)}/{\3!\2!\1\}/g'
\index{c!b!a} \index{large!medium!small} \index{elephant!dog!mouse}