现在的位置: 首页 > 综合 > 正文

sed命令(持续更新)

2013年10月03日 ⁄ 综合 ⁄ 共 4182字 ⁄ 字号 评论关闭

sed是很好用的流编辑器,网上很多sed使用规则的文章,这里只记录一些经常用的命令。

 

1. 替换后缀名
sed允许我们在规则表达式中定义区域,然后可以在替换字符串中引用这些特定区域。
使用带反斜杠的圆括号来定义区域,区域号从1开始。
$ echo "Phone.apk" | sed 's/\(.*\.\)apk/\1odex/'
Phone.odex
$ echo "Phone.apk_123_" | sed 's/\(.*\.\)apk\(_.*_\)/\1odex \2.op/'
Phone.odex _123_.op

参考:
http://groups.google.com/group/android-building/msg/62be13e41445c3eb?
ODEX files thru Build system

 

2. 最短最长匹配
我们不输入“'<' 字符后面跟有一些字符并以 '>' 字符结束”的规则表达式,而只需输入一个“'<' 字符后面跟有任意数量非 '>' 字符并以 '>' 字符结束”的规则表达式。这将与最短、而不是最长的可能性匹配。
$ echo "<lizhiguo> djk dfjk <hello> lizhiguo <sss>" | sed -e 's/<[^>]*>//g'
 djk dfjk  lizhiguo
$ echo "<lizhiguo> djk dfjk <hello> lizhiguo <sss>" | sed -e 's/<.*>//g'

3. 更多字符匹配
'[a-x]*' 将匹配零或多个全部为 'a'、'b'、'c'...'v'、'w'、'x' 的字符。另外,可以使用 '[:space:]' 字符类来匹配空格。以下是可用字符类的相当完整的列表:
字符类    描述
[:alnum:]   字母数字 [a-z A-Z 0-9]
[:alpha:]   字母 [a-z A-Z]
[:blank:]   空格或制表键
[:cntrl:]   任何控制字符
[:digit:]   数字 [0-9]
[:graph:]   任何可视字符(无空格)
[:lower:]   小写 [a-z]
[:print:]   非控制字符
[:punct:]   标点字符
[:space:]   空格
[:upper:]   大写 [A-Z]
[:xdigit:]   十六进制数字 [0-9 a-f A-F]

sed -n -e '/main[[:space:]]*(/,/^}/p' sourcefile.c | more

4. 可以引用匹配规则表达式的部分或全部,并使用这些部分来构造替换字符串。
下例将在每一行前面加上短语 "ralph said: ":
sed -e 's/.*/ralph said: &/' origmsg.txt
该例的替换字符串中使用了 '&' 字符,该字符告诉 sed 插入整个匹配的规则表达式。

5. 命令组合
$ sed -n -e '=;p' myfile.txt
$ sed -n -e '=' -e 'p' myfile.txt
$ sed -n -f mycommands.sed myfile.txt

6. 一个地址的多个命令
要对一个地址执行多个命令,可在文件中输入 sed 命令,然后使用 '{ }' 字符将这些命令分组。
1,20{ s/[Ll]inux/GNU//Linux/g s/samba/Samba/g s/posix/POSIX/g }
把三个替换命令应用到第 1 行到第 20 行(包括这两行)。

7. 既然在单独的文件中编写 sed 脚本,我们可以利用附加、插入和更改行命令。这些命令将在当前行之后插入一行,在当前行之前插入一行,或者替换模式空间中的当前行。它们也可以用来将多行插入到输出。
插入行命令用法如下:
i/ This line will be inserted before each line
如果要在当前行之前插入多行,可以通过在前一行之后附加一个反斜杠来添加附加行,如下所示:
i/ insert this line/ and this one/ and this one/ and, uh, this one too.

附加命令的用法与之类似,但是它将把一行或多行插入到模式空间中的当前行之后。
a/ insert this line after each line. Thanks! :)

“更改行”命令将实际替换模式空间中的当前行
c/ You're history, original line! Muhahaha!

8. DOS/Windows格式的文本文件在linux下打开,文件每行的结束处都会多出个^M字符,这个字符表示的是回车。
DOS/Windows 的文本文件在每一行末尾有一个 CR(回车)和 LF(换行),而 UNIX 文本只有一个换行。

有时可能需要将某些 UNIX 文本移至 Windows 系统,该脚本将为您执行必需的格式转换。
$ sed -e 's/$//r/' myunix.txt > mydos.txt
'$' 规则表达式将与行的末尾匹配,而 '/r' 告诉 sed 在其之前插入一个回车。在换行之前插入回车,立即,每一行就以 CR/LF 结束。

以下 sed 调用将把 DOS/Windows 格式的文本转换成可信赖的 UNIX 格式:
$ sed -e 's/.$//' mydos.txt > myunix.txt
替代规则表达式与一行的最末字符匹配,而该字符恰好就是回车。我们用空字符替换它,从而将其从输出中彻底删除。

9.
$ echo "build/target/board/ginwave16_a10y/init.rc" | sed 's/\(.*\/\).*/\1/' | sed "s/.*/~\/alps\/&/"
~/alps/build/target/board/ginwave16_a10y/

10. 去除空格
$ echo "sdjksv sdjk fkd dkcfd vd cv" | sed 's/\s*//g'
sdjksvsdjkfkddkcfdvdcv
$ echo "sdjksv sdjk fkd dkcfd vd cv" | sed 's/[[:space:]]*//g'
sdjksvsdjkfkddkcfdvdcv

11.取配置文件中对于项和值
$ cat etc_A.ini
MODEM=ginwave73_hspa_v39_QUAD_W2100_900
LCM=RM68042[ili9486]
MAIN_CAMERA=OV2655
SUB_CAMERA=BYD3903
CTP=GT818

#!/bin/sh

while read line
do
item=`echo $line | sed 's/\(.*\)=.*/\1/' | sed 's/\s*//g'`
value=`echo $line | sed 's/.*=\(.*\)/\1/' | sed 's/\s*//g'`

case $item in
MODEM)
        echo "[modem] $item $value"
        ;;
LCM)
        echo "[lcm] $item $value"
        ;;
MAIN_CAMERA)
        echo "[main_camera] $item $value"
        ;;
SUB_CAMERA)
        echo "[sub_camera] $item $value"
        ;;
CTP)
        echo "[ctp] $item $value"
        ;;
esac

done < $1

结果:
$ ./get.sh etc_A.ini
[modem] MODEM ginwave73_hspa_v39_QUAD_W2100_900
[lcm] LCM RM68042[ili9486]
[main_camera] MAIN_CAMERA OV2655
[sub_camera] SUB_CAMERA BYD3903
[ctp] CTP GT818
shell控制结构:http://blog.csdn.net/fansongy/article/details/6724228

 
12. 行尾行首添加字符串
$ echo "lizhiguo = mtk/src/misc/" | sed 's/\(lizhiguo = .*\)/\1 hello/'
lizhiguo = mtk/src/misc/ hello
$ echo "lizhiguo = mtk/src/misc/" | sed 's/\(lizhiguo = \)\(.*\)/\1 hello \2/'
lizhiguo =  hello mtk/src/misc/

13. 替换item的值
$ echo "lizhiguo = mtk/src/misc/" | sed 's/lizhiguo.*/lizhiguo = hello/'
lizhiguo = hello
$ echo "lizhiguo = mtk/src/misc/" | sed 's/lizhiguo = \(.*\)/lizhiguo = hello/'
lizhiguo = hello

14. 插入行
附加行
$ sed '/MODEM/a\hello baby!!!\nheheh' etc_A.ini
MODEM=ginwave73_hspa_v39_QUAD_W2100_900
hello baby!!!
heheh
LCM=RM68042[ili9486]
MAIN_CAMERA=OV2655
SUB_CAMERA=BYD3903
CTP=GT818
前插行
$ sed '/MODEM/i\hello baby!!!\nheheh' etc_A.ini
hello baby!!!
heheh
MODEM=ginwave73_hspa_v39_QUAD_W2100_900
LCM=RM68042[ili9486]
MAIN_CAMERA=OV2655
SUB_CAMERA=BYD3903
CTP=GT818
替换模式空间中的行
$ sed '/MODEM/c\hello baby!!!\nheheh' etc_A.ini
hello baby!!!
heheh
LCM=RM68042[ili9486]
MAIN_CAMERA=OV2655
SUB_CAMERA=BYD3903
CTP=GT818

注意,多行的情况下反斜杠后面需要加上n来表示回车。

 

15 去除文件重复行
$ cat 123
H200_FKD_A_eng
H200_FKD_A_user
H320_WST_A_eng
H320_WST_A_user
H320_WST_B_eng
H320_WST_B_user

$ sed -n 's/\(.*\)_.*/\1/p' 123 | sort | uniq > 456

$ cat 456
H200_FKD_A
H320_WST_A
H320_WST_B

 

持续更新...

抱歉!评论已关闭.