Shell(Linux)手册-sed

发布时间 2023-06-01 15:03:33作者: Mugetsukun

资料来源

sed修炼系列 | 骏马金龙
sed命令 | runoob

基础知识

Linux sed 命令是利用脚本来处理文本文件。
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
sed [-hnV][-e<script>][-f<script文件>][文本文件]

循环过程:

  • 读取输入流的一行到模式空间。
  • 对模式空间中的内容进行匹配和处理。
  • 自动输出模式空间内容。
  • 清空模式空间内容。
  • 读取输入流的下一行到模式空间。
(简单来说,把-e指令后面的要求条件文字匹配到后,弄一个临时处理环境。在这个临时环境进行-hnvia的指令处理,然后输出结果,再进行清空临时环境内容后退出环境。接着回到第一步再去匹配文字的循环。)

指令

(一定得看)sed修炼系列(一):花拳绣腿之入门篇

  • -n:禁止默认输出,只输出经过处理的行。
  • -i:直接修改文件内容,如果不指定备份文件,则直接修改原文件,否则将原文件备份并修改。
  • -e:允许同时执行多个命令。
  • -f:指定包含命令集合的SCRIPT文件,让sed根据SCRIPT文件中的命令集处理输入流。
  • -r:使用扩展正则表达式。
    常用命令:
  • p:打印匹配的行。
  • d:删除匹配的行。
  • s:替换匹配的文本。
  • a:在匹配行后面添加文本。
  • i:在匹配行前面插入文本。
  • q:退出 sed 命令。
  • y:替换字符
  • n:手动添加下一行到模式空间
  • =:输出行号
    常用正则表达式:
  • .:匹配任意单个字符。
  • *:匹配前面的字符零次或多次。
  • +:匹配前面的字符一次或多次。
  • ?:匹配前面的字符零次或一次。
  • []:匹配字符集中的任意一个字符。
  • ^:匹配行首。
  • $:匹配行尾。
    定址表达式
  • N:指定一个行号,sed将只匹配该行。(需要注意,除非使用了"-s"或"-i"选项,sed将对所有输入文件的行连续计数。)
  • FIRST~STEP:从第FIRST行开始,每隔STEP行就再取一次。也就是取行号满足FIRST+(N*STEP) (其中N>=0)的行。因此,要选择所有奇数行,使用"1~2";要从第2行开始每隔3行取一次,使用"2~3";要从第10行开始每隔5行取一次,使用"10~5";而"50~0"则表示只取第50行。
  • $:默认该符号匹配的是最后一个文件的最后一行,如果指定了"-i"或"-s",则匹配的是每个文件的最后一行。
  • /REGEXP/:将选择能被正则表达式REGEXP匹配的所有行。如果REGEXP中自身包含了字符"/",则必须使用反斜线转义,即"\/"。
  • /REGEXP/I:和"/REGEXP/"是一样的,只不过匹配的时候不区分大小写。
  • \%REGEXP%:('%'可以使用其他任意单个字符替换。) 这和上一个定址表达式的作用是一样的,只不过是使用符号"%"替换了符号"/"。当REGEXP中包含"/"符号时,使用该定址表达式就无需对"/"使用反斜线""转义。但如果此时REGEXP中包含了"%"符号时,该符号需要使用"\"转义。
  • ADDR1,+N:匹配ADDR1和其后的N行。
  • ADDR1,~N:匹配ADDR1和其后的行直到出现N的倍数行。倍数可为随意整数倍,只要N的倍数是最接近且大于ADDR1的即可。 如ADDR1=1,N=3匹配1-3行,ADDR1=5,N=4匹配5-8行。而"1,+3"匹配的是第一行和其后的3行即1-4行。

例子

#举个例子,假设 `a.sh` 文件的内容如下:
sed 's/\bint\b/SIGINT/g' a.sh

#!/bin/bash
echo "int main() {
    int a = 5;
    return 0;
}"

#使用 `sed 's/\bint\b/SIGINT/g' a.sh` 命令进行替换,结果如下:
#!/bin/bash
echo "SIGINT main() {
    SIGINT a = 5;
    return 0;
}"
  • s 命令表示进行替换操作。
  • / 是默认的定界符,用来分隔正则表达式和替换字符串。
  • \b 表示单词边界,匹配单词的开始或结束位置。
  • int 是要匹配的字符串,这里使用了单词边界 \b 来确保匹配的是单独的 int 单词。
  • / 是第二个定界符,用来分隔匹配字符串和替换字符串。
  • SIGINT 是要替换成的字符串。
  • g 表示全局匹配,即替换所有符合条件的字符串,而不仅仅是第一个。