我在LaTeX中编辑一本书,它的引号语法与简单的"
字符不同。所以我想将"quoted text here"
转换为``quoted text here''
。
我有50个文本文件,里面有很多引号。我尝试编写正则表达式,用"
替换第一个``
,用"
替换第二个''
,但我失败了。我在互联网上搜索并问了一些朋友,但我根本没有成功。我最接近第一个引号的是
s/"[a-z]/``/g
但这显然是错误的,因为
"quoted text here"
将成为
``uoted text here"
如何解决我的问题?
答案 0 :(得分:3)
我对你的方法感到有些困惑。不应该与s/``/"[a-z]/g
相反吗?但是,我认为它会更好:
s/``(.*?)''/"\1"/g
(.*?)
捕获``
和''
之间的内容。
\1
包含此捕获。
如果你正在寻找的是相反的(即我错误地解释了你的问题),那么我会建议:
s/"(.*?)"/``\1''/g
其原理与前一个正则表达式相同。
答案 1 :(得分:1)
使用以下内容处理多个引文,一步替换所有"
。
echo '"Quote" she said, "again."' | sed "s/\"\([^\"]*\)\"/\`\`\1''/g"
[^\"]*
避免了不合理匹配的需要which does not seem possible in sed。
答案 2 :(得分:1)
如果您使用的是 TeXmaker 软件,您可以使用带有 Replace 命令 (CTRL+R) 的正则表达式,并将以下内容放入 查找字段:
"([^}]*)"
并进入替换字段:
``$1''
然后只需按下全部替换按钮。但在那之后,你仍然要检查一切是否正常,也许你需要做一些更正。这对我来说效果很好。
答案 3 :(得分:0)
尝试对单词进行分组:
sed 's/"\([a-z]\)/``\1/'
在我的电脑上:
abhishekm71@PC:~$ echo \"hello\" | sed 's/"\([a-z]\)/``\1/'
``hello"
答案 4 :(得分:0)
这取决于您的输入文件(引号总是配对,还是可以省略?)。我建议采用以下强有力的方法:
sed 's/"\([0-9a-zA-Z]\)/``\1/g'
sed "s/\([0-9a-zA-Z]\)\"/\1\'\'/g"
假设:开头的引号后面总是紧跟一个字母或数字,一个右引号前面加一个。报价可以跨越几个单词甚至几个输入行(其他一些解决方案在发生这种情况时不起作用)。
请注意,我也会替换右引号:根据您使用的字体,双引号可以排版为中性直引号。
答案 5 :(得分:0)
您正在寻找包含在直引号中的内容不包含引号,因此最好的正则表达式是 "([^"]*?)"
。将其替换为 ``\1''
。在 Perl 中,这可以简化为 s/"([^"]*?)"/``\1''/g
。我会非常小心这种方法,它只有在所有左引号都有匹配的右引号时才有效,例如在 "one" two "three" four
中。但它会在 "one" t"wo "three" four
生成 ``one'' t``wo ''three"
时失败。