sed is an online editor that processes content one line at a time. During processing, the currently processed line is stored in a temporary buffer, called "pattern space", and then the sed command is used to process the contents of the buffer. After the processing is completed, the contents of the buffer are sent to the screen. Then process the next line, and repeat until the end of the file. The file contents are not changed unless you use redirection to store the output. Sed is mainly used to automatically edit one or more files; simplify repeated operations on files; write conversion programs, etc.
[root@www ~]# sed [-nefr] [动作]
Options and parameters:
-n: Use silent mode. In normal sed usage, all data coming from STDIN is usually listed to the terminal. But if the -n parameter is added, only the line (or action) that has been specially processed by sed will be listed.
-e: Edit sed actions directly in command line mode;
-f: Directly write sed actions in a file, -f file name, you can run the sed action in filename;
-r: The sed action supports the extended regular notation syntax. (Default is basic regular notation syntax)
-i: Directly modify the content of the read file instead of outputting it to the terminal.
Action description: [n1[,n2]]function
n1, n2: may not exist, generally represents "select the number of lines for action", for example, if my The action needs to be performed between 10 and 20 lines, then 『10,20[actionbehavior]』
function:
a:New , a can be followed by strings, and these strings will appear on a new line (the current next line)~
c: instead, c can be followed by strings, and these strings Can replace the lines between n1 and n2!
d: Delete, because it is deletion, so d is usually not followed by any dong dong;
i: Insert, i can be followed by a string, and These strings will appear on a new line (the current previous line);
p: Print, that is, print out a selected data. Usually p will be run together with the parameter sed -n~
s: replacement, you can directly perform the replacement work! Usually this s action can be paired with regular notation! For example, 1,20s/old/new/g That’s it!
List the contents of /etc/passwd and print the line number. At the same time, please delete lines 2~5!
[root@www ~]# nl /etc/passwd | sed '2,5d' 1 root:x:0:0:root:/root:/bin/bash 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown .....(后面省略).....
The action of sed is '2,5d', that d is delete! Because he deleted lines 2-5, the displayed data does not include lines 2-5~ In addition, please note that originally you should have issued sed -e, but it will work without -e! At the same time, it should also be noted that the actions that follow sed must be enclosed in two single quotes ''!
nl /etc/passwd | sed '2d'
nl /etc/passwd | sed '3,$d'
[root@www ~]# nl /etc/passwd | sed '2a new line text' 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin new line text 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin .....(后面省略).....
If you want to replace and display the contents of lines 2-5 before the second line
nl /etc/passwd | sed '2i new line text'
[root@www ~]# nl /etc/passwd | sed '2,5c No 2-5 number' 1 root:x:0:0:root:/root:/bin/bash No 2-5 number 6 sync:x:5:0:sync:/sbin:/bin/sync .....(后面省略).....
Through this method we can replace the entire row of data!
[root@www ~]# nl /etc/passwd | sed -n '5,7p' 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
You can use the line-by-line display function of sed to list a certain line in a certain file. Select some line numbers to display.
nl /etc/passwd | sed '/root/p' 1 root:x:0:0:root:/root:/bin/bash 1 root:x:0:0:root:/root:/bin/bash 2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh 3 bin:x:2:2:bin:/bin:/bin/sh 4 sys:x:3:3:sys:/dev:/bin/sh 5 sync:x:4:65534:sync:/bin:/bin/sync ....下面忽略
If root is found, except output all lines, Matching lines are also output.
When using -n, only the lines containing the template will be printed.
nl /etc/passwd | sed -n '/root/p' 1 root:x:0:0:root:/root:/bin/bash
Delete all lines containing root in /etc/passwd, and output other lines
nl /etc/passwd | sed '/root/d' 2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh 3 bin:x:2:2:bin:/bin:/bin/sh ....下面忽略 #第一行的匹配root已经删除了
After finding the line matching the pattern eastern,
Search /etc/passwd, find the line corresponding to root, and execute the following set of commands in curly brackets. Each command is separated by a semicolon. Here, bash Replace it with blueshell, and then output this line:
nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}' 1 root:x:0:0:root:/root:/bin/blueshell
If you only replace the first bash keyword of /etc/passwd with blueshell, Exit
nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}' 1 root:x:0:0:root:/root:/bin/blueshell
The last one q means exit.
In addition to the entire line processing mode, sed can also search and replace partial data in behavioral units. Basically sed's searches and substitutions are quite similar to those of vi! It's a bit like this:
sed 's/string to be replaced/new string/g'
First observe the original information and use /sbin/ifconfig Query IP
[root@www ~]# /sbin/ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84 inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 .....(以下省略).....
本机的ip是192.168.1.100。
[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
接下来则是删除后续的部分,亦即: 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g' 192.168.1.100
一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
1 root:x:0:0:root:/root:/bin/blueshell
2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
-e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为blueshell。
sed 可以直接修改文件的内容,不必使用管道命令或数据流重导向! 不过,由於这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置来测试! 我们还是使用下载的 regular_express.txt 文件来测试看看吧!
利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !
[root@www ~]# sed -i 's/\.$/\!/g' regular_express.txt
利用 sed 直接在 regular_express.txt 最后一行加入『# This is a test』
[root@www ~]# sed -i '$a # This is a test' regular_express.txt
由于 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增『# This is a test』!
sed 的『 -i 』选项可以直接修改文件内容,这功能非常有帮助!举例来说,如果你有一个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!那怎办?就利用 sed 啊!透过 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修订!
The above is the detailed content of Detailed explanation of sample code sharing for sed command in Linux. For more information, please follow other related articles on the PHP Chinese website!