使用 sed 删除连字符

使用 sed 删除连字符

我有一个简单的 xml 文件,其中包含一些分页符上的连字符。输入是这样的

 ba bla bla hyphe-</page>
 <page>nated bla bla bla

输出应该是这样的

 bla bla bla</page>
 <page>hyphenated bla bla bla

我知道 sed 命令N,但我无法控制连字符是出现在奇数行还是偶数行。

我可以用 sed 按照上面的草图删除连字符吗?是否有替代方法(例如使用其他 UNIX shell 命令或使用 python 或 perl)?

编辑。根据要求,我的输入文件中的真实示例:

[...] and vapours, upon the comparison of the air-thermo-</page>
<page>meter with the mercurial thermometer, upon the elastic [...]

编辑2:虽然我相当随机地拿起了这个例子,但这确实是一个非常令人讨厌的例子。在这种情况下想要的输出是

 [...] and vapours, upon the comparison of the</page>
<page>air-thermometer with the mercurial thermometer, upon the elastic [...]

即使用空格作为单词分隔符。对我来说,主要的问题是编写一个跨越原始换行符的模式。是的,该模式应该只删除前面的连字符</page>

答案1

Perl 中的 Oneliner(感谢 terdon!):

perl -0 -pe 's/\s+(\S+)-(<\/page>\s+<page>)(\S+)/$2$1$3/g' filename

它的作用:与正则表达式匹配,并使用匹配的部分来重建您的单词。

答案2

某种怪物)使用perl应该更容易

cat file
ba bla bla hyphe-</page>
<page>nated bla bla bla
and the output should look like

bla bla bla</page>
<page>hyphenated bla bla bla

它是 GNU sed (在其他一些 sed -s -E 选项中用于扩展正则表达式)

sed -nr '/[[:alpha:]]+-<\/[[:alpha:]]+>$/{
N
s!([[:alpha:]]+)-(</[[:alpha:]]+>)\n(<[[:alpha:]]+>)([[:alpha:]]+)!\2\n\3\1\4!}
p' file
ba bla bla </page>
<page>hyphenated bla bla bla
and the output should look like

bla bla bla</page>
<page>hyphenated bla bla bla

相关内容