sed

常用方法

sed 's/stringa1/stringa2/g' example.txt 将example.txt文件中的 "string1" 替换成 "string2" 
sed '/^$/d' example.txt 从example.txt文件中删除所有空白行 
sed '/ *#/d; /^$/d' example.txt 从example.txt文件中删除所有注释和空白行 
echo 'esempio' | tr '[:lower:]' '[:upper:]' 合并上下单元格内容 
sed -e '1d' result.txt 从文件example.txt 中排除第一行 
sed -n '/stringa1/p' 查看只包含词汇 "string1"的行 
sed -e 's/ *$//' example.txt 删除每一行最后的空白字符 
sed -e 's/stringa1//g' example.txt 从文档中只删除词汇 "string1" 并保留剩余全部 
sed -n '1,5p;5q' example.txt 查看从第一行到第5行内容 
sed -n '5p;5q' example.txt 查看第5行 
sed -e 's/00*/0/g' example.txt 用单个零替换多个零 

#以'# bic'开头 删除注释
sed -i 's/^#\([ ]*bic\)/\1/' zimu.txt  #\1的就类似于前面的'bic','()'里面是一个整体,\1就是复制这个位置的内容,如果有第2个,那么\2就是复制第2个位置的内容

#以'bic'开头 添加注释
sed -i 's/^[ ]*bic/#&/' zimu.txt  # '&'是匹配任意字符(就是啥都行),这条命令是替换以'bic'开头的为 '#bic'

sed -i "/^\(#[ ]\)*external_url/c\external_url \'http://scnu-george.cn\'" /etc/gitlab/gitlab.rb  #将含有以 '#external_url' 或 空格external_url 开头的行替换为 external_url 'http://scnu-george.cn'

sed -i "/^root/a\\${user} ALL = (ALL:ALL) NOPASSWD:ALL" /etc/sudoers  #在以 `root` 开头的行下面插入

替换

基本替换

sed替换的基本语法为:

sed 's/原字符串/替换字符串/'

s后面跟的是分隔符,原字符串可使用.*这种正则表达式进行整行替换

单引号里面,s表示替换; 三根斜线中间是替换的样式,特殊字符需要使用反斜线 "\" 进行转义,但是单引号 "'" 是没有办法用反斜线 "\" 转义的,这时候只要把命令中的单引号改为双引号就行了,例如:

sed "s/原字符串包含'/替换字符串包含'/"

要处理的字符包含单引号

命令中的三根斜线分隔符可以换成别的符号,这在要替换的内容有较多斜线是较为方便,只需要紧跟s定义即可,例如换成问号 "?":

sed 's?原字符串?替换字符串?'

可以在末尾加g替换每一个匹配的关键字,否则只替换每行的第一个

sed 's/原字符串/替换字符串/'

sed处理过的输出是直接输出到屏幕上的,要保存可以将输出重定向或者使用参数”-i”直接在文件中替换:

sed -i 's/原字符串/替换字符串/g' filename

常用替换

”^”表示行首,美元”$”符号如果在引号中表示行尾,但是在引号外却表示末行

sed 's/^/添加的头部&/g' #在所有行首添加
sed 's/$/&添加的尾部/g' #在所有行末添加
sed '2s/原字符串/替换字符串/g' #替换第2行
sed '$s/原字符串/替换字符串/g' #替换最后一行
sed '2,5s/原字符串/替换字符串/g' #替换2到5行
sed '2,$s/原字符串/替换字符串/g' #替换2到最后一行

替换样式可以多个在同一条命令中执行,用分号”;”分隔,例如,同时执行两个替换规则:

sed 's/^/添加的头部&/g;s/$/&添加的尾部/g'

替换变量

两种方法

sed 's/'$a'/'$b'/' filename
sed s/$a/$b/ filename

比如替换路径,将 210727/mxAOIService 替换为 ${MX_INFER_SDK_DIR}/mxAOIService

sed s:210727/Service:${MX_INFER_SDK_DIR}/Service:g amd64.yml
sed 's:210727/Service:'${MX_INFER_SDK_DIR}'/Service:g' amd64.yml
sed "s:210727/Service:\\${MX_INFER_SDK_DIR}/Service:g" amd64.yml

以上3种写法都可以,推荐第1种。最好不要用第3种,转义有时候需要 \\\\

# realm 开头的注释该为 realm = ${PRO_REPO} 的配置

PRO_REPO=/home/svs
sed -i "s:^\(#[ ]\)*realm.*:realm = \\${PRO_REPO}:g" svnserve.conf

如果要实现文件替换复制,也可以用管道

SRC_PATH=/home/a
DST_PATH=/home/b
src_file=${SRC_PATH}/1.xml
dst_file=`echo ${src_file} |sed "s:${SRC_PATH}:${DST_PATH}:g"`
cp -f ${src_file} ${dst_file}

参考

  1. shell脚本之sed使用----替换、变量、转义字符

results matching ""

    No results matching ""