如何在Linux中使用SED命令

时间:2020-03-05 15:29:25  来源:igfitidea点击:

SED缩写为"Stream Editor"是一个强大的文本流编辑器,可以在搜索,查找和替换和插入的文件上执行大量功能。
SED命令是正则表达式识别命令,意味着它可以理解提供给它的正则表达式。

虽然,SED主要是或者主要用于文本替代。
在SED的帮助下,我们可以编辑文件而不打开它,这将要快得多,更快地查找和更换文件中的内容,而不是打开文件并更改它。

在本教程中,我们将在Linux shell中使用易于使用和了解示例,以易于使用和了解SED命令。

SED命令语法

SED命令语法非常简单,但使用非常强大。
这是SED的基本语法,如下所示:

sed OPTIONS... [SCRIPT] [INPUTFILE...]

将下面的文本文件('content.txt')视为sed示例命令的输入。

$cat > content.txt
lorem ipsum is a dummy text. lorem ipsum has been the industry's standard dummy text.
lorem ipsum is highly used by designers. lorem ipsum is great for developers.
lorem ipsum is used for dummy text. lorem ipsum doesn't have meaning.
learn more about dummy text.

以下是最常用的SED示例如下。

1.替换字符串(单词或者字符)

SED可用于查找并替换输入上的字符串(单词或者字符)。
选项s用于替换字符串。
默认情况下,SED命令只替换行中的第一个出现字符串。

以下命令用"Content.txt"文件中的"Lorem"替换"Lorem"单词,以便在每行的第一个出现的"Content.txt"文件中:

$sed's/lorem/lorem /'content.txt

这里'lorem'是搜索字符串,'lorem'是替换字符串。

Output
$sed 's/lorem/Lorem/' content.txt
Lorem ipsum is a dummy text. lorem ipsum has been the industry's standard dummy text.
Lorem ipsum is highly used by designers. lorem ipsum is great for developers.
Lorem ipsum is used for dummy text. lorem ipsum doesn't have meaning.
learn more about dummy text.

2.在文件中替换所有字符串的发生

要搜索和替换文件中的所有字符串中的所有出现,请使用/g(全局替换)标志。

在以下命令中,使用"content.txt"中的"Lorem"替换字符串"Lorem"的所有发生的所有出现。

$sed 's/lorem/Lorem/g' content.txt
Lorem ipsum is a dummy text. Lorem ipsum has been the industry's standard dummy text.
Lorem ipsum is highly used by designers. Lorem ipsum is great for developers.
Lorem ipsum is used for dummy text. Lorem ipsum doesn't have meaning.
learn more about dummy text.

3.替换一条线条的第n次发生模式

SED命令可以与/1/2或者n(任何数字)一起使用,以在线中替换一条串的第一个,第二或者第n个发生。

以下命令用每行中的"Lorem"替换第二个(2)次出现"Lorem"。

$sed 's/lorem/Lorem/2' content.txt
lorem ipsum is a dummy text. Lorem ipsum has been the industry's standard dummy text.
lorem ipsum is highly used by designers. Lorem ipsum is great for developers.
lorem ipsum is used for dummy text. Lorem ipsum doesn't have meaning.
learn more about dummy text.

与TR命令类似,SED可以使用SET2中的相应字符替换SET1中的所有字符,使用y/set1/set2 /

$echo 'a for apple' | sed -e 'y/af/AF/
Output
A For Apple

4.从第n次发生到每行的所有事件

我们可以使用"/1","/2"或者"N"(任何数字)和"/G"(任何数字)和""/G"的组合中替换每行中的第N个字符串的所有模式。

在以下示例中,字符串'Lorem'的所有出现将从每行的第二次发生中替换为"Lorem":

$sed 's/lorem/Lorem/2g' content.txt
lorem ipsum is a dummy text. Lorem ipsum has been the industry's standard dummy text.
lorem ipsum is highly used by designers. Lorem ipsum is great for developers.
lorem ipsum is used for dummy text. Lorem ipsum doesn't have meaning.
learn more about dummy text.

5.在指定的行号上搜索并替换字符串

使用SED,我们可以限制仅替换特定行号上的字符串。

在以下命令中,我们可以发现只有第二行被字符串'lorem'替换。

$sed '2 s/lorem/Lorem/' content.txt
lorem ipsum is a dummy text. lorem ipsum has been the industry's standard dummy text.
Lorem ipsum is highly used by designers. Lorem ipsum is great for developers.
lorem ipsum is used for dummy text. lorem ipsum doesn't have meaning.
learn more about dummy text.

6.显示文件的部分文本

使用sed命令我们可以查看文件的某些部分而不是整个文件。
"-n"选项用于禁止打印所有内容和p选项打印特定行。

以下命令将从2到4中打印行:

$sed -n 2,4p content.txt
lorem ipsum is highly used by designers. lorem ipsum is great for developers.
lorem ipsum is used for dummy text. lorem ipsum doesn't have meaning.
learn more about dummy text.

7.显示除特定行以外的所有内容

SED命令允许显示除特定行之外的文件的所有内容。
在下面的命令中,除了第1行和第2行之外,在文件'content.txt'上显示所有内容:

$sed 1,2d content.txt
lorem ipsum is used for dummy text. lorem ipsum doesn't have meaning.
learn more about dummy text.

8.显示除图案匹配线之外的所有线路

我们可以使用以下SED命令删除具有所提到的搜索模式的行。
在输出中,删除具有"学习"的行,因为它与搜索模式匹配。

$sed '/learn/d' content.txt
lorem ipsum is a dummy text. lorem ipsum has been the industry's standard dummy text.
lorem ipsum is highly used by designers. lorem ipsum is great for developers.
lorem ipsum is used for dummy text. lorem ipsum doesn't have meaning.

9.显示替换线

为了打印更换的线路,我们使用/p标志和-n使用。

在输出中,我们可以看到没有最后一行,因为它没有搜索模式'lorem'。

$sed -n 's/lorem/Lorem/p' content.txt
Lorem ipsum is a dummy text. lorem ipsum has been the industry's standard dummy text.
Lorem ipsum is highly used by designers. lorem ipsum is great for developers.
Lorem ipsum is used for dummy text. lorem ipsum doesn't have meaning.

更多的'p'和'n'标志的例子

打印第一行

$sed -n '1p' content.txt

打印范围线

$sed -n '1,4p' content.txt

打印多行

$sed -n '1p;4p' content.txt

打印文件

$sed -n 'p' content.txt

打印包含正则表达式或者单词

$sed -n '/RedHat/p' content.txt

打印(如果包含数字)

$sed -n '/[0-9]/p' content.txt

匹配正则表达式并替换

$sed -n 's/^L/Matched--&/p' content.txt
Output
Matched--Lorem ipsum is a dummy text. Lorem ipsum has been the industry's standard dummy text.
Matched--Lorem ipsum is highly used by designers. Lorem ipsum is great for developers.
Matched--Lorem ipsum is used for dummy text. Lorem ipsum doesn't have meaning.

使用sed就像grep

以下SED命令将在"/etc/passwd"文件中搜索用户的"root":

$sed -n '/root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

10.组合SED命令

如果我们必须执行多个SED表达式,那么我们需要使用E选项来链接SED命令。

让我们举个例子,用"Lorem"替换"Lorem"的所有发生并删除与搜索模式匹配的行。

$sed -e 's/lorem/Lorem/g' -e '/learn/d' content.txt
Lorem ipsum is a dummy text. Lorem ipsum has been the industry's standard dummy text.
Lorem ipsum is highly used by designers. Lorem ipsum is great for developers.
Lorem ipsum is used for dummy text. Lorem ipsum doesn't have meaning.

11.每行后插入空行

使用"g""选项,我们可以在文件中插入单个或者多个空行。

以下命令在行之间插入单个空行:

$sed G content.txt
lorem ipsum is a dummy text. lorem ipsum has been the industry's standard dummy text.
lorem ipsum is highly used by designers. lorem ipsum is great for developers.
lorem ipsum is used for dummy text. lorem ipsum doesn't have meaning.
learn more about dummy text.

要插入两个空行,请运行以下命令:

$sed 'G;G' content.txt
lorem ipsum is a dummy text. lorem ipsum has been the industry's standard dummy text.
lorem ipsum is highly used by designers. lorem ipsum is great for developers.
lorem ipsum is used for dummy text. lorem ipsum doesn't have meaning.
learn more about dummy text.

11.编辑并创建原始文件的备份副本

SED允许编辑文件和同一时间创建原始文件的备份副本。
我们使用'i。
<文件扩展名>'用于备份文件名和-e编辑。

以下命令创建原始文件"content.txt"的备份为"content.txt.bak"

$sed -i.bak -e 's/lorem/Lorem/g' content.txt
Results
$cat content.txt
Lorem ipsum is a dummy text. Lorem ipsum has been the industry's standard dummy text.
Lorem ipsum is highly used by designers. Lorem ipsum is great for developers.
Lorem ipsum is used for dummy text. Lorem ipsum doesn't have meaning.
learn more about dummy text.
$cat content.txt.bak
lorem ipsum is a dummy text. lorem ipsum has been the industry's standard dummy text.
lorem ipsum is highly used by designers. lorem ipsum is great for developers.
lorem ipsum is used for dummy text. lorem ipsum doesn't have meaning.
learn more about dummy text.

12.用模式删除一条线

使用此SED命令,我们可以删除以特定字符串开头的行,并以另一个字符串结尾。
在以下输出中,带有启动'lorem'的行并以'文本结尾。
被删除:

$sed -e 's/^lorem.*text.$//g' content.txt
Output
lorem ipsum is highly used by designers. lorem ipsum is great for developers.
lorem ipsum is used for dummy text. lorem ipsum doesn't have meaning.
learn more about dummy text.

13.将字符串添加到行

我们可以执行以下命令,以便在使用Regex之前添加一些内容。

在以下输出中,我们可以在每一行的前面添加"此处"。

$sed -e 's/.*/Here &/' content.txt
Here lorem ipsum is a dummy text. lorem ipsum has been the industry's standard dummy text.
Here lorem ipsum is highly used by designers. lorem ipsum is great for developers.
Here lorem ipsum is used for dummy text. lorem ipsum doesn't have meaning.
Here learn more about dummy text.

每行之前插入字符串:

$sed 'i \inserted line' content.txt
inserted line
Lorem ipsum is a dummy text. Lorem ipsum has been the industry's standard dummy text.
inserted line
Lorem ipsum is highly used by designers. Lorem ipsum is great for developers.
inserted line
Lorem ipsum is used for dummy text. Lorem ipsum doesn't have meaning.
inserted line
learn more about dummy text.

每行后追加字符串:

$sed 'a \Appended line' content.txt
Lorem ipsum is a dummy text. Lorem ipsum has been the industry's standard dummy text.
Appended line
Lorem ipsum is highly used by designers. Lorem ipsum is great for developers.
Appended line
Lorem ipsum is used for dummy text. Lorem ipsum doesn't have meaning.
Appended line
learn more about dummy text.
Appended line

14.从/etc/passwd文件中提取用户名

SED命令可以轻松用于获取"/etc/passwd"文件的所有用户名列表。

以下SED命令将提取所有USERNAMES可用Linux:

$sed 's/\([^:]*\).*//' /etc/passwd
root
daemon
bin
sys
sync
man
lp
news
uucp
proxy
backup
list
gnats
nobody
systemd-network
systemd-resolve
syslog
messagebus
uuidd
debian-spamd
admin

15.打印线路没有注释线(#)和空线

没有注释的打印(#)线条和空行与sed很简单。

我们可以执行以下命令来打印所有行,不包含注释符号(#)和所有空行。

$sed -e 's/#.*//;/^$/d' content.txt

只删除注释的行:

$sed -e 's/#.*//' content.txt

16.从字符串中提取所有IP地址

让我们检查如何使用Regex使用sed命令提取IP地址。
我为"Content.txt"添加了一些IP地址进行测试。

$cat content.txt
lorem ipsum is a dummy text. lorem ipsum has been the industry's standard dummy text.
lorem ipsum is highly used by designers. lorem ipsum is great for developers.
lorem ipsum is used for dummy text. lorem ipsum doesn't have meaning.
learn more about dummy text.
122.65.49.2
221.11.165.233
219.158.9.97
219.158.19.137

现在,让regex从"content.txt"文件中提取IP地址,如下所示:

$sed '/\n/!s/[0-9.]\+/\n&\n/;/^\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\n/P;D' content.txt
122.65.49.2
221.11.165.233
219.158.9.97
219.158.19.137

我找到了另一个易于获取相同结果的easy命令,请查看以下:

$sed -n '/[0-9]/p' content.txt.bak
122.65.49.2
221.11.165.233
219.158.9.97
219.158.19.137

我们还可以使用管道(|)将SED与其他命令合并(|),查看以下示例:

$ip addr | sed -n '/inet/p' | sed -e 's/ *//g' | cut -d ' ' -f3
127.0.0.1/8
::1/128
75.208.225.10/24
2600:3c02::e03c:92ff:fe60:d7e2/64
fe80::f03c:92ef:fe60:d7e2/64

17.重定向并写入文件

W标志可用于将输出写入文件,而不是在标准输出上打印。
"w"命令"需要写入输出的文件名。

以下SED命令将输出重定向到新文件'rootpwd.txt':

$sed -n '/root/w rootpwd.txt' /etc/passwd
$cat rootpwd.txt
root:x:0:0:root:/root:/bin/bash