我有一个文件file1.tex
,其中包含TeX命令,例如\em
和\par
。所有命令的格式为\
+来自A-Z的一些大写和小写字母串,后面跟一个空格。
我需要使用这样的命令,用\
替换所有空格,斜杠和空格。
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
形式的任何命令之后出现的空格?
答案 0 :(得分:3)
由于sed
不支持look-behind,我认为使用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
- 全球替换我在列表中留下了一些不言自明的东西。
答案 1 :(得分:2)
这可能对您有用:
sed -i 's/\(\\[^ ]*\) /\1\n/g;s/ /\\ /g;y/\n/ /' file
说明:
s/\(\\[^ ]*\) /\1\n/g
\
添加所有其他空格。 s/ /\\ /g
y/\n/ /
答案 2 :(得分: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
HTH
答案 3 :(得分:1)
用一些可识别的文本替换TeX命令末尾的空格,在所有空格之前添加斜杠,最后删除您添加的文本。例如:
s;\(\\[[:alpha:]]\{1,\}\);\1{};g
s; ;\\ ;g
s;\(\\[[:alpha:]]\{1,\}\){};\1 ;g
在这里,我选择将{}
添加到TeX命令的末尾,这是安全的,因为您知道该结构不存在TeX命令。