2

我有一个文件,file1.tex,其中包含 TeX 命令,例如\em\par。所有命令的格式都是\+ 一些来自 AZ 的大写和小写字母字符串,并且后面都跟一个空格。

我需要使用这样的命令,它将所有空格替换为\、斜杠和空格。

sed -i "s/\ /\\\\\ /g" ./file1.tex

我不希望这些替换在 TeX 命令之后立即出现的空格。例如,我想要这个:

\noindent This is a sentence {\em which has some words}.
This is another \hfill sentence \ldots with some more words.

成为:

\noindent This\ is\ a\ sentence\ {\em which\ has\ some\ words}.
This\ is\ another\ \hfill sentence\ \ldots with\ some\ more\ words.

如何替换所有空格,除了出现在任何形式的命令之后的空格\sometext

4

4 回答 4

3

由于sed不支持后视,我认为使用 Perl 会容易得多。

$ perl -pe 's/\b(?<!\\)(\w+)\b /$1\\ /g' texfile
\noindent This\ is\ a\ sentence\ {\em which\ has\ some\ words}.
This\ is\ another\ \hfill sentence\ \ldots with\ some\ more\ words.

要就地对文件进行永久更改:

perl -pi -e 's/\b(?<!\\)(\w+)\b /$1\\ /g' texfile

解释:

正则表达式匹配不以反斜杠开头且后跟空格的单词。

  • \b- 单词边界
  • (?<!- 开始一个非捕获的负面回顾(不匹配)
  • \\- 转义反斜杠
  • )- 关闭后视
  • (- 开始一个捕获组
  • \w+- 匹配一个或多个单词字符(字母数字加下划线)
  • )- 关闭捕获组
  • $1- 将捕获组复制到替换中
  • \\- 添加反斜杠
  • g- 全局替换

我在清单之外留下了一些不言而喻的东西。

于 2012-05-20T02:47:26.373 回答
2

这可能对您有用:

 sed -i 's/\(\\[^ ]*\) /\1\n/g;s/ /\\ /g;y/\n/ /' file

解释:

  • 用换行符替换命令后的所有单个空格。s/\(\\[^ ]*\) /\1\n/g
  • 在所有其他空格前加上\.s/ /\\ /g
  • 用空格替换所有换行符。y/\n/ /
于 2012-05-20T08:07:27.637 回答
1

我会这样使用awk

awk '{ for (i=1; i<NF; i++) if ($i ~ /\\/) printf "%s ", $i; else if ($i !~ /\\/) printf "%s\\ ", $i; printf $NF"\n" }' file.tex

高温高压

于 2012-05-20T02:18:55.460 回答
1

用一些可识别的文本替换 TeX 命令末尾的空格,在所有空格之前添加斜杠,最后删除您添加的文本。例如:

s;\(\\[[:alpha:]]\{1,\}\);\1{};g
s; ;\\ ;g
s;\(\\[[:alpha:]]\{1,\}\){};\1 ;g

在这里,我选择添加{}到 TeX 命令的末尾,这是安全的,因为您知道该结构中不存在任何 TeX 命令。

于 2012-05-20T08:03:37.757 回答