在 Bash 中用另一个字符串替换子字符串

这是场景。 你有一个大字符串,你想用另一个字符串替换它的一部分。

为了 example,你想改变“我正在写一行 今天” to “我在写一行 现在”。

在这个快速教程中,我将向您展示如何在 Bash 中本地替换子字符串。 我还将展示 sed 命令 example 作为扩展。

在本机替换子字符串 bash (适合单行)

Bash 有一些用于字符串操作的内置方法。 如果您想用另一个字符串替换部分字符串,您可以这样做:

${main_string/search_term/replace_term}

创建一个包含以下行的字符串变量:“I am writing a line today”,不带引号,然后替换 todaynow

[email protected]:~$ line="I am writing a line today"
[email protected]:~$ echo "${line/today/now}"
I am writing a line now

你明白刚刚发生了什么吗? 在语法中 "${line/today/now}", line 是我刚刚存储整个句子的变量的名称。 在这里,我指示它 替换第一次出现 这个词的 todaynow. 因此,它没有显示原始变量的内容,而是显示了更改后的单词所在的行。

因此, line 变量实际上并没有改变。 它仍然是一样的:

[email protected]:~$ echo $line
I am writing a line today

但是您绝对可以替换您想要的单词并修改相同的变量以使更改永久化:

[email protected]:~$ line="${line/today/now}"
[email protected]:~$ echo $line
I am writing a line now

现在更改已永久生效,这就是您可以永久替换字符串中第一次出现的子字符串的方式。

您还可以使用其他变量来存储要替换的特定子字符串:

[email protected]:~$ replace="now"
[email protected]:~$ replacewith="today"
[email protected]:~$ line="${line/${replace}/${replacewith}}"
[email protected]:~$ echo $line
I am writing a line today

在这里,我将要替换的单词存储在一个名为 replace 以及将替换为 inside 的词 replacewith. 之后,我使用与上述相同的方法来“修改”该行。 现在,我在本教程开始时所做的更改已恢复。

让我们看看另一个 example:

[email protected]:~$ hbday="Happy Birthday! Many Many Happy Returns!"
[email protected]:~$ hbday="${hbday/Many/So Many}"
[email protected]:~$ echo $hbday
Happy Birthday! So Many Many Happy Returns!

替换所有出现的子字符串

您还可以替换字符串中多次出现的子字符串。 让我们通过另一个来看看 example:

[email protected]:~$ hbday="${hbday//Many/So Many}"
ib[email protected]:~$ echo $hbday
Happy Birthday! So Many So Many Happy Returns!

那个额外的 /hbday 使它取代了所有出现的 ManySo Many 句内。

使用 sed 命令替换字符串(也可以处理文件)

这是替换字符串中的子字符串的另一种方法 bash. 以这种方式使用 sed 命令:

替换第一次出现:

line=$(sed "s/$replace/s//$replacewith/" <<< "$line")

如果我拿第一个 example可以这样播放:

您还可以通过添加替换所有出现 g 在末尾:

line=$(sed "s/$replace/$replacewith/g" <<< "$line")

现在,你可能认为这是一个比原生更复杂的 bash 字符串方法。 也许吧,但是 sed 非常强大,您可以使用它来替换文件中所有出现的字符串。

sed -i 's/$replace/$replacewith/' filename

这是一个 example 阿加莎·克里斯蒂 (Agatha Christie) 的一些标题为“谋杀”的书:

[email protected]:~$ cat agatha.txt 
The Murder in the Vicarage
Murder in Mesopotamia
Murder is Easy
Murder on the Orient Express
Murder In Retrospect

我打算用婚姻代替谋杀,因为有些人认为两者是一样的:

sed -i "s/Murder/Marriage/g" agatha.txt

这是现在更改的文件:

The Marriage in the Vicarage
Marriage in Mesopotamia
Marriage is Easy
Marriage on the Orient Express
Marriage In Retrospect

Sed 是一个非常强大的工具,用于在 Linux 中编辑文本文件。 你至少应该学习它的基础知识。

你喜欢阅读这篇文章吗? 如果您对替换字符串或本文有任何要分享的内容,请在下面的评论中进行。