sed
时间:2008-03-24 来源:jaffaz
sed是流编辑器,用于编辑标准输入或文件,将结果输出到标准输出中。
sed中有几个比较重要的概念:地址、数据缓冲区、命令
地址:用于定位哪些行需要执行某个命令。地址可以是行号,正规表达式等形式
NUMBER 指定行号为NUMBER的行
FIRST~STEP 从FIRST起每隔STEP行(FIRST+ N*STEP)
$ 末行
/REGEXP/ 与REGEXP正规表达式匹配的行,REGEXP含有'/'的话用'\/'代替
\%REGEXP% 与/REGEXP/类似,但'%'可以换成任何字符,避免使用'\'转义字符
/REGEXP/I
\%REGEXP%I 大小写不敏感
ADDR1, ADDR2 从ADDR1起,到ADDR2止的所有行
ADDR, +N 从ADDR起,及其接下来N行
ADDR, ~N 从ADDR起,到N行止
ADDR! 不匹配ADDR的行
数据缓冲区:sed维护两个数据缓冲区,pattern和hold。sed从文件里面读出数据,存到pattern缓冲区里
面。大多数命令都是对pattern的数据进行操作。hold是一个用于存储中间数据的缓冲区,sed提供将
pattern里面的数据存放到hold里面、从hold里面取出数据放到pattern中以及交换两个缓冲区数据的
操作命令。
命令:
# 注释,不能用地址修饰
q [exit-code] 退出sed
d 删除pattern的内容
p 将pattern的内容输出到标准输出
{} {}括起一组命令,可以使用同一个地址
s/REGEXP/REPLACEMENT/FLAGS
substitution,串替换命令。将匹配REGEXP的串替换为REPLACEMENT。
REPLACEMENT中的功能串:
\L 后面的字符都转换为小写,直到遇到'\U'或'\E'
\l 接下来的第一个字符转换为小写
\U 后面的字符都转换为大写,直到遇到'\L'或'\E'
\u 接下来的第一个字符转换为大写
\E 前面\L或\U的转换终止
FLAGS标志:
g sed的s命令默认只是替换第一个匹配的串。加g标志后,替换所有匹配的串
NUMBER 指定替换第几个匹配的串
p 假如pattern中有匹配的串被替换,将替换后的pattern输出
w file-name 类似p,但替换后的pattern输出到file-name中。file-name只能是
/dev/stdout或/dev/stderr
I
i REGEXP匹配的时候忽略大小写
y/src-chars/dst-chars/
将pattern中的所有src-chars字符一一转换成dst-chars中对应位置的字符
'a text'
'a\
text' 在pattern中追加一行'text'的内容
'i text'
'i\
text' 在pattern中插入一行'text'的内容
'c text'
'c\
text' 将pattern的内容替换为text
= 输出当前行号,带换行符
l N 输出pattern的所有内容,不可打印字符用转义字符形式输出
N指定了输出多少个字符后换行
r file-name 执行周期结束时读取file-name文件的内容,插入到输出流中
w file-name 将pattern的数据写入file-name文件中
file-name只能是/dev/stdout或/dev/stderr
D 只删除pattern里面的第一行,若删除后pattern不为空,对该pattern重新
启动一次执行周期
N 往pattern追加换行
h 复制pattern的数据到hold中
H 往hold追加换行,然后再追加pattern的数据
g 复制hold的数据到pattern中
G 往pattern追加换行,然后再追加hold的数据
x 交换pattern和hold的数据
sed中有几个比较重要的概念:地址、数据缓冲区、命令
地址:用于定位哪些行需要执行某个命令。地址可以是行号,正规表达式等形式
NUMBER 指定行号为NUMBER的行
FIRST~STEP 从FIRST起每隔STEP行(FIRST+ N*STEP)
$ 末行
/REGEXP/ 与REGEXP正规表达式匹配的行,REGEXP含有'/'的话用'\/'代替
\%REGEXP% 与/REGEXP/类似,但'%'可以换成任何字符,避免使用'\'转义字符
/REGEXP/I
\%REGEXP%I 大小写不敏感
ADDR1, ADDR2 从ADDR1起,到ADDR2止的所有行
ADDR, +N 从ADDR起,及其接下来N行
ADDR, ~N 从ADDR起,到N行止
ADDR! 不匹配ADDR的行
数据缓冲区:sed维护两个数据缓冲区,pattern和hold。sed从文件里面读出数据,存到pattern缓冲区里
面。大多数命令都是对pattern的数据进行操作。hold是一个用于存储中间数据的缓冲区,sed提供将
pattern里面的数据存放到hold里面、从hold里面取出数据放到pattern中以及交换两个缓冲区数据的
操作命令。
命令:
# 注释,不能用地址修饰
q [exit-code] 退出sed
d 删除pattern的内容
p 将pattern的内容输出到标准输出
{} {}括起一组命令,可以使用同一个地址
s/REGEXP/REPLACEMENT/FLAGS
substitution,串替换命令。将匹配REGEXP的串替换为REPLACEMENT。
REPLACEMENT中的功能串:
\L 后面的字符都转换为小写,直到遇到'\U'或'\E'
\l 接下来的第一个字符转换为小写
\U 后面的字符都转换为大写,直到遇到'\L'或'\E'
\u 接下来的第一个字符转换为大写
\E 前面\L或\U的转换终止
FLAGS标志:
g sed的s命令默认只是替换第一个匹配的串。加g标志后,替换所有匹配的串
NUMBER 指定替换第几个匹配的串
p 假如pattern中有匹配的串被替换,将替换后的pattern输出
w file-name 类似p,但替换后的pattern输出到file-name中。file-name只能是
/dev/stdout或/dev/stderr
I
i REGEXP匹配的时候忽略大小写
y/src-chars/dst-chars/
将pattern中的所有src-chars字符一一转换成dst-chars中对应位置的字符
'a text'
'a\
text' 在pattern中追加一行'text'的内容
'i text'
'i\
text' 在pattern中插入一行'text'的内容
'c text'
'c\
text' 将pattern的内容替换为text
= 输出当前行号,带换行符
l N 输出pattern的所有内容,不可打印字符用转义字符形式输出
N指定了输出多少个字符后换行
r file-name 执行周期结束时读取file-name文件的内容,插入到输出流中
w file-name 将pattern的数据写入file-name文件中
file-name只能是/dev/stdout或/dev/stderr
D 只删除pattern里面的第一行,若删除后pattern不为空,对该pattern重新
启动一次执行周期
N 往pattern追加换行
h 复制pattern的数据到hold中
H 往hold追加换行,然后再追加pattern的数据
g 复制hold的数据到pattern中
G 往pattern追加换行,然后再追加hold的数据
x 交换pattern和hold的数据
相关阅读 更多 +