Home  >  Article  >  Operation and Maintenance  >  Detailed explanation of sample code sharing for sed command in Linux

Detailed explanation of sample code sharing for sed command in Linux

黄舟
黄舟Original
2017-06-07 10:26:161516browse

Introduction

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.

sed usage parameters

[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!

Add/Delete in line units

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

Just delete the 2nd line

nl /etc/passwd | sed '2d'

To delete the 3rd to the last line

nl /etc/passwd | sed '3,$d'

Add " after the second line (that is, add it to the third line) new line text?』 words!

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

in line units

replace the contents of lines 2-5 with "No 2- What about "5 number"?

[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!

Only list lines 5-7 in the /etc/passwd file

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

Search and display data

Search/etc/passwd for lines with root keyword

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

Search and delete data

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已经删除了

Search and execute commands for data

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.

Search and replace data

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。

将 IP 前面的部分予以删除

[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

将 IP 后面的部分予以删除

[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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn