如何替换除TeX命令后出现的空格以外的所有空格?

时间:2012-05-20 00:59:51

标签: bash sed replace

我有一个文件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形式的任何命令之后出现的空格?

4 个答案:

答案 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命令。