Contents

 sed命令使用字符串或 shell 变量作为输入

1. 概述

sed 命令是一个常见的 Linux 命令行文本处理实用程序。使用此命令处理文本文件非常方便。 但是,有时,我们希望 sed命令处理的文本不在文件中。相反,它可以是文字字符串或保存在 shell 变量中。 在这个简短的教程中,我们将了解如何让 sed命令处理文字字符串或 shell 变量。

2. 使用 echo命令和管道

** sed命令可以读取和处理来自输入文件或标准输入流的**文本。

由于我们的文本没有保存在文件中,如果我们能以某种方式将文本写入stdin,那么 sed就可以读取它。在 Linux 中,管道 可以帮助我们将标准输出定向到标准输入。

**因此,我们可以先使用 echo 命令将文本输出到 stdout,然后再通过管道传递给sed命令。**让我们看一个例子:

$ echo "We love Linux." | sed 's/We/They/; s/Linux/Microsoft Windows/'
They love Microsoft Windows.

如上例所示,echo “文本”| sed解决了我们的问题。如果我们的文本在 shell 变量中,这种方式也可以:

$ TEXT="We love Linux"
$ echo $TEXT | sed 's/We/They/; s/Linux/Microsoft Windows/'
They love Microsoft Windows

3. 使用echo命令和进程替换

我们已经学会了将 echo 命令的标准输出通过管道传递给sed命令来解决问题。除此之外,我们还可以使用进程替换来解决我们的问题。

**进程替换可以将进程的输出保存在临时文件中,并将文件提供给另一个进程。**它的模板如下所示:

another_process <(process)

回到我们的问题,我们可以在进程替换中输出我们的文本并将其提供给 sed命令:

$ sed 's/We/They/; s/Linux/Microsoft Windows/' <(echo "We love Linux.")
They love Microsoft Windows.

如果文本在 shell 变量中,同样的方法也适用:

$ sed 's/We/They/; s/Linux/Microsoft Windows/' <(echo $TEXT)
They love Microsoft Windows.

4.管道和流程替代的区别

到目前为止,我们已经看到了两种不同的方法来解决这个问题:管道和进程替换。我们可能想问,管道和进程替换有什么区别?让我们通过示例来了解差异。

管道将内容从标准输出重定向到标准输入。但是,进程替换执行一个命令,将输出保存到一个特殊的临时文件,然后将文件名传递给另一个命令。

进程替换创建的临时文件实际上是一个命名管道 。让我们验证一下:

$ [[ -p <(date) ]] && echo "It is a pipe"
It is a pipe

*[[…]]*中 的 -p测试进程替换是否是管道。

一个例子可以帮助我们以更直接的方式理解差异:

$ echo <(date)
/dev/fd/63
$ cat <(date)
Wed Jan  6 12:30:44 PM CET 2021

如果我们将文件传递给echo命令,则echo不会打印文件的内容。相反,文件名将由echo命令显示。这就是示例中的第一个echo命令不显示日期字符串的原因。

但是,如果我们将进程替换传递给接受文件的命令,则会读取进程替换的内容。在上面的示例中,我们将 *<(date)*传递给 cat命令。正如我们所见,日期字符串被打印出来了。

管道和进程替换在使用上的另一个区别是我们不能使用管道管道多个命令的标准输出。但是我们可以使用进程替换来做到这一点。

让我们看一个例子:

$ diff <(date -d 'yesterday') <(date -d 'tomorrow')
1c1
< Tue Jan  5 12:47:37 PM CET 2021
---
> Thu Jan  7 12:47:37 PM CET 2021

在上面的示例中,我们使用两个进程替换将两个不同的日期字符串作为两个文件传递给 diff命令以显示差异。但是,我们无法使用管道实现相同的效果。

5. 使用here-string

将文字文本或变量提供给 stdin 的另一种方法是使用*here-string *:

$ sed 's/We/They/; s/Linux/Microsoft Windows/' <<< "We love Linux."
They love Microsoft Windows.
$ sed 's/We/They/; s/Linux/Microsoft Windows/' <<< $TEXT
They love Microsoft Windows.