SED 札记

Sed基础

替换管道或命令行输入的数据

nl dukeofyork.txt | sed 's/the/The/'

输入并输出文件

sed 's/the/THE/' < dukefyork.txt > output.txt

全局替换

1
sed 's/^/   /g' fruit.txt  替换成tab制表符, 终端下需要按ctrl+v

#g标记可以使sed替换弟N次出现的匹配

1
2
3
4
5
$ echo thisthisthisthis | sed 's/this/THIS/2g'
thisTHISTHISTHIS
$ echo thisthisthisthis | sed 's/this/THIS/3g'
thisthisTHISTHIS
$ echo thisthisthisthis | sed 's/this/THIS/4g' 8 thisthisthisTHIS

替换的文字中有单引号的需要用双引号限定两边

sed "s/were/weren 't/" dukeofyork.txt
# 有时候需要反义符
sed "s/were/\"\$werent\'t\"/" dukeofyork.txt

去除tag标记

1
sed -E 's/<[^<>]+>//g' homepage.html

使用指定的数字替换文件中所有3位数的数字

1
sed -i 's/\b[0-9]\{3\}\b/NUMBER/g' sed_data.txt

单词互换

1
echo "Dan Stevens" | sed -E 's/([A-Za-z]+) ([A-Za-z]+)/\2, \1/'

获取指定行的数据

1
sed '4297196!d' /temp/tmp_sqp_export_2711.txt

移除空行

1
sed '/^$/d' file  最后的/d告诉sed不执行替换操作,而是直接删除匹配到的空行

修改默认分隔符

sed命令会将s之后的字符串视为命令分隔符。这允许我们修改默认分隔符

1
2
sed 's:text:replace:g'
sed 's|text|replace|g'

替换的同时备份文件

1
sed -i.bak 's/abc/def/' file  这时的sed不仅替换文件内容,还会创建一个名为file.bak的文件

已匹配字符串标记

在sed中,我们可以用&指代模式锁匹配到的字符串,在这个栗子中,正则表达式\w+匹配每一个单词然后,然后我们用[&]替换它。

1
2
$ echo this is an example | sed 's/\w\+/[&]/g'
[this] [is] [an] [example]

正则表达

. 匹配任意一个字符

/a.c/ 匹配”abc”,”axc”但不匹配”ac”,”axxc”

^$匹配行首和行尾

/^abc/ 匹配 ”abcd” 不匹配“dadc”
/abc$/ 不匹配”abcd” 匹配 ”dabc“

[]匹配集合中的任何字符

/a[xyz]c/ 匹配 ”axc” 但是不匹配 “axyzc” 因为只是匹配一个字符
/a[a-z]c/ 匹配”abc”
/a[a-zA-Z]c/ 匹配“abc” 或 ”abc”
/a[^a-z]c/ 不匹配 “abc”

sed 's/the[^]/YOU/g' xxx.txt

* 匹配0个或多个重复

/ab*c/ 匹配”abc”,”abbbbc”,”ac” 但是不匹配”axc”

()重复多个

/abc/ 匹配 “abbbbbc”
/(ab)
c/ 匹配 “ababababac”

Greediness

/<.*>/ 匹配 `<i>italic text</i>` 匹配html标记
sed -E 's/(apple|pear|plum|peach)/\1 tree/' fruit.txt
sed -E 's/(...)time/\1light/' 或 sed 's/\(...\)time/\1light/'
sed 's/\(they)\) \(were\)/\2 \2/g' xxx.txt
sed 's/weeeere \([a-z]*\)/\13d/g' xxx.txt

参数

使用-i选项会使得sed用修改后的数据替换原始文件

sed -i 's/text/replace/' file

-n + p组合打印替换后的行

sed -n 's/the/THE/pg' dukeofyork

-e执行多个替换参数

sed -e 's/up/UP/' -e 's/down/DOWN/' dukeofyou.txt

-f从文件执行替换条件

cat > script
# change ten thousand men to one woman
s/ten thousand/one/
s/men/woman/g
s/were/was/g

sed -f script xxxx.txt

命令

使用P命令打印行

打印第三行

sed -n 3p dukefyork.txt

打印最后一行

sed -n '$p' xxx.txt

打印1~3行

sed -n '1,3 p' dukefo.txt

当grep用

sed -n '/[Tt]he[my]/p' xxx.txt

,匹配出第一个匹配词到最后一个匹配词的所有行

nl xxx.txt | sed -n '/marched/,/when/p'
sed -n '/^}/,/^{/p' array
nl xxx.txt | sed -n '2,/down/p'  #第二行到第一个down行
nl xxx.txt | sed -n '2,5!p' 显示2~5行以外的行

使用D参数删除行

# 删除第四行
nl dukeofyork.txt | sed '4d'
nl dukeofyork.txt | sed '/up/d'
nl dukeofyork.txt | sed '/thousand/,/down/d'

使用RW读取写入文件

# 读取文件将down替换为haha.txt中的文字
sed '/down/r haha.txt' dukeofyork.txt
# 将 dukeofyork.txt的1~3行写入文件 top.txt
sed '1,3w top.txt' dukeofyork.txt
# 将替换后的UP写入到文件up
sed 's/up?UP/w up' dukeofyork.txt
sed 's/up/UP/wg up' dukeofyork.txt
sed -e '/down/w down' -e 's/up/UP/' dukeofyourk.txt
sed -e 's/up/UP/w out' -e 's/down/DOWN/w out' dukeofyork.txt

使用’Y’命令进行转换类似tr

sed 'y/abcdef/ABCDEF/' dukeofyork.txt
sed 'y/aceilost/4(3!10$+)' dukeofyork.txt

综合

将array.c中的main函数输出到 main.c

sed -n '/^[a-z]* main *(/,/^}/w main.c' array.c

sed 编程

大括号

# 当行包含when的时候将up和down替换成UP和DOWN
cat > script
/when/ s/up/UP/g
/when/ s/down/DOWN/g
#另一种写法
cat > script
/when/ {
    s/up/UP/g
    s/down/DOWN/g
}
sed -f script dukeofyork.txt

# 修改不包含when的行的up和down字符
cat > script
/when/ ! {
    s/up/UP/g
    s/down/DOWN/g
}

# 3~6行包含when的xxxxx
cat > script
3,6 {
    /when/ {
        s/up/UP/g
        s/down/DOWN/g
    }
}
nl xx.txt | sed -f script

下一行n命令

# 当你发现marched字符后执行 n命令,将下一行进行替换
cat > script
/marched/ {
    n
    s/^/((/
    n
    s/$/))/
}

使用q命令退出

# 匹配到again以后就退出
sed '/again/q' dukeof.txt
# 等同
sed -n '1,/again/p' dukeof.txt
# 前一个栗子中如果在匹配的两个括号后面加个q那么添加好括号以后整个程序就会结束
cat > script
/marched/ {
    n
    s/^/((/
    n
    s/$/))/
    q
}

=命令显示显示当前行号

$ cate script
/marched/ {
    n
    =
    s/^/((/
    n
    =
    s/$/))/
    =
}

l命令显示不可见字符

cat script
s/ /    /3
l

sed -f script kex.txt

高级编程

N将下一行加入处理缓存(pattern space),一起处理

cat script
/marched/ {
    N
    s/\n/ - /
}
sed -f script
打赏支持:如果你觉得我的文章对你有所帮助,可以打赏我哟。