ZhangZhihui's Blog  

Search and print matched lines:

scnzzh@ZUBT1:~/zzh$ sed -n '/ExecStart/p' docker.service 
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

 

Search and replace pattern:

scnzzh@ZUBT:~$ echo 'app[01:100].com' | sed 's/.*\[/\[/'
[01:100].com

 

Search and replace in file:

scnzzh@ZUBT1:~/zzh$ grep '\-H fd://' test.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
scnzzh@ZUBT1:~/zzh$ sed -i 's/-H fd:\/\//-H fd:\/\/ -H tcp:\/\/10.0.2.5:2375/' test.service
scnzzh@ZUBT1:~/zzh$ grep '\-H fd://' test.service
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://10.0.2.5:2375 --containerd=/run/containerd/containerd.sock

 

Multiple search and delete following 2 lines in file:

sed -i -e '/\(zabbix_wrapper.pl\|type="thread"\|type="collect"\)/,+2d' $line

 

'<' and '>' don't need to be escaped:

sed -i 's/<depend>PARALLEL_THREAD<\/depend>/<depend>NONE<\/depend>/g' $line

 

Change position:

cat test1
first:second
one:two
sed 's/\(.*\):\(.*\)/\2:\1/' test1
second:first
two:one

 

Use semicolon to execute multiple commands:

cnzzh@zubt1:~/zzh$ seq 6
1
2
3
4
5
6
scnzzh@zubt1:~/zzh$ seq 6 | sed '1d;3d;5d'
2
4
6

 

Replace multiple blank lines with one:

scnzzh@zubt1:~/zzh$ cat a.txt
1


2


3





4

5
scnzzh@zubt1:~/zzh$ sed '/^$/N;/^\n$/D' a.txt
1

2

3

4

5

How it works (Step-by-Step)

To understand this, you have to know that sed processes text line-by-line in a "pattern space" (a temporary buffer).

The command consists of two parts separated by a semicolon:

1. /^$/N

  • /^$/: This is a pattern match for an empty line (start of line ^ immediately followed by end of line $).

  • N: If the pattern matches (i.e., we are on an empty line), the N command tells sed to read the next line and append it to the current pattern space, separated by a newline character (\n).

  • Result: You now have two lines in your buffer.

2. /^\n$/D

  • /^\n$/: This checks if the two lines you just joined are both empty. In sed syntax, an empty line followed by another empty line in the buffer looks like \n.

  • D: This is the "Delete" command, but with a twist. If the pattern matches (meaning we found two consecutive empty lines), D deletes the first part of the pattern space (up to the newline) and restarts the cycle with the remaining pattern space.

  • Result: It keeps "eating" empty lines one by one until it encounters a line that actually contains text.

 

Remove all blank lines:

scnzzh@zubt1:~/zzh$ sed '/^$/d' a.txt
1
2
3
4
5

 

Remove lines those only contain whitespaces:

scnzzh@zubt1:~/zzh$ cat a.txt
        

aaa
    bbb
        

ccc
scnzzh@zubt1:~/zzh$ sed -r '/^\s*$/d' a.txt
aaa
    bbb
ccc

Replace multiple whitespace lines to one line:

scnzzh@zubt1:~/zzh$ sed '/^\s*$/N;/^\s*$/D' a.txt

aaa
    bbb

ccc

 

Replace values of parameters/variables:

/home/scnzzh/zzh $> cat b.txt
binpath=/PATH/TO/SCRIPTS/
aa_binpath=/PATH/TO/AA/

/home/scnzzh/zzh $> sed "s/binpath=\(.*\)/binpath=aaa/" b.txt
binpath=aaa
aa_binpath=aaa

/home/scnzzh/zzh $> sed "s/^binpath=\(.*\)/binpath=aaa/" b.txt
binpath=aaa
aa_binpath=/PATH/TO/AA/

 

posted on 2020-11-24 11:35  ZhangZhihuiAAA  阅读(111)  评论(0)    收藏  举报