Linux - sed 常用操作
sed 文本常用操作方式
sed 10q # 显示文件中的前10行 (模拟"head") sed -n '$=' # 计算行数(模拟 "wc -l") sed -n '5,/^no/p' # 打印从第5行到以no开头行之间的所有行 sed -i "/^$f/d" a # 删除匹配行 sed -i '/aaa/,$d' # 删除匹配行到末尾 sed -i "s/=/:/" c # 直接对文本替换 sed -i "/^pearls/s/$/j/" # 找到pearls开头在行尾加j sed -n '1,3p' file # 打印1和3之间的行 sed -n '1p' 文件 # 取出指定行 sed '5i\aaa' file # 在第5行之前插入行 sed '5a\aaa' file # 在第5行之后抽入行 echo a|sed -e '/a/i\b' # 在匹配行前插入一行 echo a|sed -e '/a/a\b' # 在匹配行后插入一行 echo a|sed 's/a/&\nb/g' # 在匹配行后插入一行 seq 10| sed -e{1,3}'s/./a/' # 匹配1和3行替换 sed -n '/regexp/!p' # 只显示不匹配正则表达式的行 sed '/regexp/d' # 只显示不匹配正则表达式的行 sed '$!N;s/\n//' # 将每两行连接成一行 sed '/baz/s/foo/bar/g' # 只在行中出现字串"baz"的情况下将"foo"替换成"bar" sed '/baz/!s/foo/bar/g' # 将"foo"替换成"bar",并且只在行中未出现字串"baz"的情况下替换 echo a|sed -e 's/a/#&/g' # 在a前面加#号 sed 's/foo/bar/4' # 只替换每一行中的第四个字串 sed 's/\(.*\)foo/\1bar/' # 替换每行最后一个字符串 sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替换倒数第二个字符串 sed 's/[0-9][0-9]$/&5/' # 在以[0-9][0-9]结尾的行后加5 sed -n ' /^eth\|em[01][^:]/{n;p;}' # 匹配多个关键字 sed -n -r ' /eth|em[01][^:]/{n;p;}' # 匹配多个关键字 echo -e "1\n2"|xargs -i -t sed 's/^/1/' {} # 同时处理多个文件 sed '/west/,/east/s/$/*VACA*/' # 修改west和east之间的所有行,在结尾处加*VACA* sed 's/[^1-9]*\([0-9]\+\).*/\1/' # 取出第一组数字,并且忽略掉开头的0 sed -n '/regexp/{g;1!p;};h' # 查找字符串并将匹配行的上一行显示出来,但并不显示匹配行 sed -n ' /regexp/{n;p;}' # 查找字符串并将匹配行的下一行显示出来,但并不显示匹配行 sed -n 's/\(mar\)got/\1ianne/p' # 保存\(mar\)作为标签1 sed -n 's/\([0-9]\+\).*\(t\)/\2\1/p' # 保存多个标签 sed -i -e '1,3d' -e 's/1/2/' # 多重编辑(先删除1-3行,在将1替换成2) sed -e 's/@.*//g' -e '/^$/d' # 删除掉@后面所有字符,和空行 sed -n -e "{s/文本(正则)/替换的内容/p}" # 替换并打印出替换行 sed -n -e "{s/^ *[0-9]*//p}" # 打印并删除正则表达式的那部分内容 echo abcd|sed 'y/bd/BE/' # 匹配字符替换 sed '/^#/b;y/y/P/' 2 # 非#号开头的行替换字符 sed '/suan/r 读入文件' # 找到含suan的行,在后面加上读入的文件内容 sed -n '/no/w 写入文件' # 找到含no的行,写入到指定文件中 sed '/regex/G' # 在匹配式样行之后插入一空行 sed '/regex/{x;p;x;G;}' # 在匹配式样行之前和之后各插入一空行 sed 'n;d' # 删除所有偶数行 sed 'G;G' # 在每一行后面增加两空行 sed '/^$/d;G' # 在输出的文本中每一行后面将有且只有一空行 sed 'n;n;n;n;G;' # 在每5行后增加一空白行 sed -n '5~5p' # 只打印行号为5的倍数 seq 1 30|sed '5~5s/.*/a/' # 倍数行执行替换 sed -n '3,${p;n;n;n;n;n;n;}' # 从第3行开始,每7行显示一次 sed -n 'h;n;G;p' # 奇偶调换 seq 1 10|sed '1!G;h;$!d' # 倒叙排列 ls -l|sed -n '/^.rwx.*/p' # 查找属主权限为7的文件 sed = filename | sed 'N;s/\n/\t/' # 为文件中的每一行进行编号(简单的左对齐方式) sed 's/^[ \t]*//' # 将每一行前导的"空白字符"(空格,制表符)删除,使之左对齐 sed 's/^[ \t]*//;s/[ \t]*$//' # 将每一行中的前导和拖尾的空白字符删除 sed '/{abc,def\}\/\[111,222]/s/^/00000/' # 匹配需要转行的字符: } / [ echo abcd\\nabcde |sed 's/\\n/@/g' |tr '@' '\n' # 将换行符转换为换行 cat tmp|awk '{print $1}'|sort -n|sed -n '$p' # 取一列最大值 sed -n '{s/^[^\/]*//;s/\:.*//;p}' /etc/passwd # 取用户家目录(匹配不为/的字符和匹配:到结尾的字符全部删除) sed = filename | sed 'N;s/^/ /; s/ *\(.\{6,\}\)\n/\1 /' # 对文件中的所有行编号(行号在左,文字右端对齐) /sbin/ifconfig |sed 's/.*inet addr:\(.*\) Bca.*/\1/g' |sed -n '/eth/{n;p}' # 取所有IP
删除第一行、最后一行或增加删除某行
1、删除文档的第一行 sed -i '1d' test.txt 2、删除文档的最后一行 sed -i '$d' test.txt 3、在文档指定行中增加一行 例如文档如下: echo "1"; echo "2"; echo "4"; echo "5"; # 在echo "2"行 后 添加 一行 echo "3"; sed -i '/echo "2";/a echo "3";' test.txt
# 在echo "2"行 前 添加 一行 echo "5"
sed -i '/echo "2";/i echo "5"' test.txt
格式:
sed -i '/字符 /a 新字符' test.txt 4、删除文件中的第3行 sed -i '3d' test.txt 5、删除文件中包含某个关键字开头的所有行 sed -i '/^QWQ/d' test.txt 6、删除文件中包含某个关键字 QWQ 的所有行 sed -i '/QWQ/d' test.txt
7、每行 首行 添加字符
sed -i 's/^/2/' test.txt
删除 首行 字符
sed -i 's/^2//' test.txt
8、每行 行尾 添加字符
sed -i 's/$/2/' test.txt
删除 行尾 字符
sed -i 's/2$//' test.txt
sed 's///g' 与sed 's///' 的区别
+g :匹配每一行有行首到行尾的所有字符
不加g 配每一行的行首开始匹配,匹配到第一个符合的字段
9、 打印第一行第一个字符不包含空白
cat -A /var/spool/cron/root | awk -F '' '{print $1}'
10、删除 指定关键字 name 行 后五行
sed -i '/name/,+5d' file.txt
sed 匹配行内字符变更
sed -i '1i\111' file
# 第一行之前添加
sed -i '1a\111' file
# 第一行之后添加
1、特殊字符前添加
sed -i "s/111/222&/g" test.txt
# 在 111 字符前 加 222
sed -i "s/111/&222/" test.txt
# 在 111 字符后 加 222
sed -i "s/.*111/222&/g" test.txt
#在 包含 111 所在行的行首 添加 222
sed -i "s/111.*/222&/g" test.txt
#在 包含 111 所在行的行尾 添加 222
sed -i "/111/i\bbb" test.txt
# 在 包含 111 字符的文件所在行前 添加一行 bbb
sed -i "/111/a\bbb" test.txt
# 在 包含 111 字符的文件所在行后 添加一行 bbb
2、 匹配注释 sed -i "s/^[^#].*restart/#&/g" test.txt # 匹配含有 restart 的 非# 开头的行加 # 注释
3、匹配取消注释
sed -i "/^#.*restart/s/^#//" /var/spool/cron/root
# 匹配含有 restart 的取消注释
4、取消所有行首字母#
sed -i "s/^#//g" /var/spool/cron/root
查询 打印 文件首行
find /opt/services/ -name 'changelog.txt' -exec sed -n 1p {} \;