这里是一些参考.
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
指令被执行一次,就删除一行空白, 如此直到新引入的行不再是空白为止. 所以连续的空白行被压缩到一行.
网友评论