linux通过sed命令/shell下删去文件中包含某个字符串的行/读取指定行/删除指定行/添加文本到指定行
删除文件中带有某个字符串的所有行
a.txt
sed -e '/xxx/d' a.txt -->打印出来 文件中包含xxx的行都不会显示 使用-i参数的话就直接修改文件了
修改指定字符串
sed -e 's/aaa/bbb/g' 全局aaa替换为bbb
打印指定行
cat a.txt | sed -n '1,3p' 打印文件a.txt的1到3行
没有找到相关结果
已邀请:
11 个回复
nccloud
这两个命令可以将上面双引号中的内容全部拿出来。
awk -F'"' '{i = 1; while (i <= NF) {if ($i ~/=$/) print $(i+1);i++}}' plan.xml
sed 's/[^"]*="[′′]∗["]∗"[^"]*/\1/g;s/"/\n/g' plan.xml
简单一点可以使用下面的命令:只拿其中的一个值。
awk:awk -F "[\"\"]" '{print $2}' aaa.txt
sed: cat aaa.txt | sed 's/.*".∗.∗".*/\1/'
nccloud
sed 替换指定行,如包含aaa的行
sed -i '/aaa/ { s/111/AAA/g; s/222/BBB/g; }' filename
nccloud
sed -i.bak '$a export JAVA_HOME=/application/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
解释上面sed语句:
在/etc/profile最末尾处插入一段环境变量,.bak会备份/etc/profile;$表示最后一行,a表示追加;\n表示换行
nccloud
root@node2 sxf]# cat /etc/hosts #查看文件内容
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.26.10 node0
192.168.26.11 node1
192.168.26.12 node2
192.168.26.13 node3
192.168.26.14 node4
[root@node2 sxf]# sed -n 4p /etc/hosts #查看文件第四行内容
192.168.26.11 node1
[root@node2 sxf]# sed -n 4p /etc/hosts|cut -d ' ' -f1 #查看文件第四行第一列内容
192.168.26.11
[root@node2 sxf]# sed -n 4p /etc/hosts|cut -d ' ' -f2 #查看文件第四行第二列内容
node1
nccloud
sed命令常用到的两个选项:
-i : 直接在文件上编辑 (edit files in place)
-e[默认选项]:只在命令行输出,而文件不改变
(add the script to the commands to be executed)
注:使用sed命令可以使用 -i 或者 -e 选项(以下例子仅以-i举例)
sed命令删除特定行号
删除第N行
sed -i 'Nd' filename
删除第N~M行
sed -i 'N,Md' filename # file的[N,M]行都被删除
删除shell变量表示的行号(配合for等语句使用)
sed -i "${var1},${var2}d" filename # 这里引号必须为双引号
删除最后一行
sed -i '$d' filename
sed命令删除包含特定字符行
删除包含"xxx"的行
sed -i '/xxx/d' filename
nccloud
如替换内容包含特殊字符,如标准的/符号。则可以修改间隔符, 例如 sed "s#原#目的#g" 为
nccloud
只删除纯空行
sed '/^\s*$/d' file
删除纯空行和由空格组成的空行
sed '/^[ ]*$/d' file
nccloud
Linux 添加文本到指定行/在文件的指定行添加内容(shell, sed)
话题相关
#Linux如何添加文本到指定行
#shell如何添加文本到指定行
#sed 插入文本
用sed来插入文本到指定行。
基本语法
-i
,是编辑文档“edit files in place”选项。插入行前/行后
行前用
i
,行后用a
。i
比a
常用。当然要插入内容到最后一行就得用
a
了。同样要插入内容到文件第一行需要用i
。所以这个插入操作要注意行号的变化。下面的内容多次添加文本时注意具体写了注意的内容。
作用范围行
注意如果是刚建好的空文件是写不进内容的,因为空文件没有行号。
(sed是不能处理空文件的,可参考这篇文章。 链接:sed不能处理空文件)
最后一行用
$
表示。把内容插入到某行应该是最常用的。 也是本文题目所指。
效果是这样的,
注意这一点这vim中的作用范围不太一样,vim中不写作用范围的话是作用于光标所在的当前行,而sed是指全文范围。
效果是这样的,
多次添加文本时注意
本文讲的插入方法,就像上面讲的,插入的是指定行的行前/行后,也就是是相对位置。
比如,
这个例子里的插入到第2行,实际上插入到原来的第2行前面取代了第2行,之前的第2行在插入内容后就变成了第3行。
如果多次插入内容,要注意行号是随着内容的更新而更新的。
比如这个失败的例子,想要把hello1写到第1行,hello2写到第2行。
按行号顺序插入是一个解决方法。
如果是要求将内容绝对地插入指定行,应该考虑文本替换。
文本替换相关的内容可以参考这篇文章 sed 文本替换 。
(以上。)
nccloud
如何替换掉特殊字符,例如()和空格?
参考:
单独的:
replaced_name="$(echo $SPUG_REQUEST_NAME | sed 's/ //g')"
replaced_name="$(echo $replaced_name | sed 's/[(]//g')"
replaced_name="$(echo $replaced_name | sed 's/[)]//g')"
replaced_name="$(echo $replaced_name | sed 's/[)]//g')"
replaced_name="$(echo $replaced_name | sed 's/[(]//g')"
合并的:
sed 's/[ ()()]//g
相对于是使用[]扩住所有想替换掉的字符
nccloud
sed -i 5s/a/A/ test.txt 对第五行的a替换成A
nccloud
使用以下
sed
命令删除所有空行。解释:
/./
匹配任何字符,包括换行符。!
否定选择器,即它使命令应用于与选择器不匹配的行,在这种情况下是空行。d
删除选定的行。cou.data
是输入文件的路径。