gnu sed 替换中文标点,删除空白行

这里是一些参考.

BRE and extended regular expression

基本正则表达式扩展正则表达式是指定模式语法的两种变体. (Basic and extended regular expressions)
基本正则表达式(BRE)的语法是sed中默认的(同样在grep中也是如此).
使用POSIX指定的-E选项(-r, --regexp-extended)来启用扩展正则表达式(ERE)语法.

GNU sed中, 基本正则表达式扩展正则表达式之间的唯一区别在于几个特殊字符的行为:

?, +, 小括号 (), 大括号 {} , 以及 | 

基本(BRE)语法中, 这些字符没有特殊含义, 除非前缀是反斜杠``\;
而在扩展(ERE)语法中, 情况正好相反: 这些字符是特殊的, 除非它们被反斜杠前缀转义.

替换中文标点,压缩空白行

# 如果只想打印, 不想实际更改, 就去掉 -i 选项. 
# 不要同时使用 -i -n 选项, 会造成文件丢失.
sed -i \
-e '{
s#[“”]#"#g;
s#[‘’]#"#g;
s#:#: #g;
s#,#, #g;
s#。#. #g;
s#、#, #g;
s#…#... #g;
s#——# -- #g;
s#(#(#g; s#)#)#g;
s#;#\; #g;
s#!#! #g;
s#?#? #g;
s#‹#<#g; s#›#>#g;
s#《#<#g; s#》#>#g;
s#【#\[#g; s#】#\]#g;
s#『#\{#g; s#』#\}#g;
}' \
-zre 's#\n([ \t]*\n[ \t]*)+\n#\n\n#g' \
-zre 's#([ \t]+\n)#\n#g'

解释:

# 删除连续空行
-zre 's#\n([ \t]*\n[ \t]*)+\n#\n\n#g' \
# 替换: 评估->计算
-e 's#评估#计算#g' 
# 删除行末空白
-zre 's#(\n[ \t]+)#\n#g'

参考

chinaunix--删除连续空白行
csdn--删除连续空白行

echo -e "1\n\n\n\n2" | sed -zEe 's#\n(?:[ \t]*\n[ \t]*)+\n#\n\n#g'

解释为:

\n # 换行
(?:[ \t]*\n[ \t]*)+ # ?: 表示不捕获匹配; 后面是冗余行的表示: 空白接换行接空白, 可以有多个, 
\n #换行, 替换成两个换行, 也就是插入单行空白.

另一种方法:

echo -e "1\n\n\n\n2" | sed -e '#^$#{N#^.$#D}'
echo -e "1\n\n\n\n2" | sed -e '#^$#{N;#\n$#D};'

其中, 参数N 表示, 将空白行的下一行文本添加到pattern space内.
参数#^.$#D 表示, 若添加的是空白行, 就删除第一行空白, 保留第二行, 再次循环这个过程.
D指令被执行一次,就删除一行空白, 如此直到新引入的行不再是空白为止. 所以连续的空白行被压缩到一行.

你可能感兴趣的:(gnu sed 替换中文标点,删除空白行)