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行

已邀请:

这两个命令可以将上面双引号中的内容全部拿出来。


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/'


sed 替换指定行,如包含aaa的行


sed -i '/aaa/ { s/111/AAA/g;  s/222/BBB/g; }'  filename

  1. 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

  2. 解释上面sed语句:

  3. 在/etc/profile最末尾处插入一段环境变量,.bak会备份/etc/profile;$表示最后一行,a表示追加;\n表示换行


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

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


如替换内容包含特殊字符,如标准的/符号。则可以修改间隔符, 例如  sed "s#原#目的#g" 为

只删除纯空行

sed '/^\s*$/d' file


删除纯空行和由空格组成的空行

sed '/^[  ]*$/d' file

Linux 添加文本到指定行/在文件的指定行添加内容(shell, sed)

话题相关
#Linux如何添加文本到指定行
#shell如何添加文本到指定行
#sed 插入文本

用sed来插入文本到指定行。

基本语法

  • 只是在屏幕输出/打印中显示更改,并不改变文件本身内容
sed '作用范围行 插入行前/行后 插入内容' 文件名
# 中间的空格也可省略
sed '作用范围行插入行前/行后插入内容' 文件名
# 常常在插入内容前留空格
sed '作用范围行插入行前/行后 插入内容' 文件名
  • 1
  • 2
  • 3
  • 4
  • 5
  • 添加文本常常需要的是添加内容到文件里,更新文件,要在sed后面加 -i,是编辑文档“edit files in place”选项。
sed -i '作用范围行 插入行前/行后 插入内容' 文件名
  • 1

插入行前/行后

# sample.txt文件第1行前面添加“hello”;实质就是插入内容到文件第1行
sed -i '1 i hello' sample.txt

# sample.txt文件第1行后面添加“hello”;实质就是插入内容到文件第2行
sed -i '1 a hello' sample.txt
  • 1
  • 2
  • 3
  • 4
  • 5

行前用 i ,行后用a
ia常用。
当然要插入内容到最后一行就得用a了。同样要插入内容到文件第一行需要用i

所以这个插入操作要注意行号的变化。下面的内容多次添加文本时注意具体写了注意的内容。

作用范围行

注意如果是刚建好的空文件是写不进内容的,因为空文件没有行号。
(sed是不能处理空文件的,可参考这篇文章。 链接:sed不能处理空文件

最后一行用$表示。

  • 插入内容到某行,直接写指定行号。

把内容插入到某行应该是最常用的。 也是本文题目所指。

# 把"hello"插入到第2行
sed -i '2i hello' sample.txt

# 把"hello"插入到最后一行
sed -i '$a hello' sample.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 行号位置为空,即不写行号,就是作用范围在全文每一行
sed -i 'i hello' sample.txt
  • 1

效果是这样的,

$ cat test.txt 
a
b
c
d
# 不写行号,作用在每一行
$ sed 'i hello' test.txt
hello
a
hello
b
hello
c
hello
d
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

注意这一点这vim中的作用范围不太一样,vim中不写作用范围的话是作用于光标所在的当前行,而sed是指全文范围。

  • 指定某行到某行,用逗号连接行号
$ sed '2,4 i hello' test.txt 
  • 1

效果是这样的,

$ cat test.txt 
a
b
c
d
# 作用在原本的第2行到第4行
$ sed '2,4 i hello' test.txt
a
hello
b
hello
c
hello
d
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

多次添加文本时注意

本文讲的插入方法,就像上面讲的,插入的是指定行的行前/行后,也就是是相对位置。
比如,

# 把"hello"插入到第2行
sed -i '2i hello' sample.txt
  • 1
  • 2

这个例子里的插入到第2行,实际上插入到原来的第2行前面取代了第2行,之前的第2行在插入内容后就变成了第3行。

如果多次插入内容,要注意行号是随着内容的更新而更新的。

比如这个失败的例子,想要把hello1写到第1行,hello2写到第2行。

# 失败的例子
# 文件原本的内容
$ cat test.txt
happy,happy,c
a,cat,c

$ sed -i '2i hello2' test.txt
# 此时的确将hello2 插入到了第二行
$ cat test.txt
happy,happy,c
hello2
a,cat,c

$ sed -i '1i hello1' test.txt
# 这时虽然将hello1插入第2行,但是hello2就不再是在第2行,而跑去了第3行
$ cat test.txt
hello1
happy,happy,c
hello2
a,cat,c
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

按行号顺序插入是一个解决方法。

如果是要求将内容绝对地插入指定行,应该考虑文本替换。

# 文本替换是绝对的指定行
# 例,设定第3行内容为hello3
sed '3s/.*/hello3/' test.txt
  • 1
  • 2
  • 3

文本替换相关的内容可以参考这篇文章 sed 文本替换 。

(以上。)

如何替换掉特殊字符,例如()和空格?


参考:


单独的:

 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

相对于是使用[]扩住所有想替换掉的字符

sed -i 5s/a/A/ test.txt 对第五行的a替换成A  

使用以下sed命令删除所有空行。

sed '/./!d' cou.data

解释:

  • /./ 匹配任何字符,包括换行符。
  • ! 否定选择器,即它使命令应用于与选择器不匹配的行,在这种情况下是空行。
  • d 删除选定的行。
  • cou.data 是输入文件的路径。

要回复问题请先登录注册