最近在shell对文本进行操作,遇到了使用sed进行最小匹配的问题。sed默认匹配规则是贪婪匹配。举例来说,如果文本内容为:(aa)bb(cc)使用sed匹配:'/(.*)/'匹配结果为:(aa)bb(cc)上述结果即贪婪匹配。最小匹配的结果是获取规则字符串之间的最小内容,即为:(aa) (cc)这两个结果。sed获取最小匹配的方法:1.通过...
grep
匹配
是linux的最常用的shell命令之一。
grep的
匹配
的默认
匹配
为单行
匹配
和
贪婪
匹配
,因此需要特殊的技巧将其转化为多行
匹配
和
最小
匹配
。
多行
匹配
:
grep -zoe "start-string.*stop-string" file
最小
匹配
的方法与
sed
最小
匹配
的方法相同:
grep -o "strart-string[^stop-string]*stop-string...
sed
里面默认走的是最大
匹配
,
sed
删除的时候如果行当中多次出现()这种情况,这种情况下会最大化的
匹配
(),从而将我们需要的字符也去除,这不是我们要的结果,如下面这个例子
文件aaa内容如下:
wt_yunnan 1.1.1.1(wt__pic_zu1), 2.2.2.2(wt_pic_zu8),3.3.3.3(wt_pic_zu3),
Pakistan_PTCL 4.44...
目前为止,我们只执行了简单的
字符串
替换
。虽然这很方便,但是我们还可以
匹配
规则表达式。例如,以下
sed
命令将
匹配
从 '' 结束、并且在其中包含任意数量字符的短语。下例将删除该短语(用空
字符串
替换
):
$
sed
-e 's///g' myfile.html
这是要从文件除去 HTML 标记的第一个很好的
sed
脚本尝试,但是由于规则表达式的特有规则,它不会很好地工作。原因何在?当
因为其采用了
贪婪
匹配
法则,但显然这不是我们想要的。
修改代码如下,将其改为最短
匹配
法则:
echo '(abc)Hello(def)World'|
sed
's/([^)]*)//g'
HelloWorld
[1]
sed
替换
字符串
的
贪婪
匹配
和
最小
匹配
[CSDN]
[2]
sed
匹配
最短模式的方法 [CSDN]
shell中
sed
利用正则表达式
匹配
字符串
时,默认使用
贪婪
模式,且只有
贪婪
模式,没有非
贪婪
模式。
贪婪
模式:
匹配
最长的
字符串
,开始尽量早、结束尽量晚
http://blog.chinaunix.net/uid-10540984-id-2954393.html
其中,s表示
替换
操作,/要
替换
的
字符串
/表示需要
替换
的
字符串
模式,/
替换
后的
字符串
/表示
替换
后的
字符串
模式,g表示全局
替换
。
例如,将文件example.txt中的所有"Hello"
替换
为"Hi",可以使用以下命令:
sed
's/Hello/Hi/g' example.txt
如果要直接修改文件内容,可以使用-i选项,例如:
sed
-i 's/Hello/Hi/g' example.txt
这个命令会直接将example.txt文件中的所有"Hello"
替换
为"Hi",并保存文件。