📌  相关文章
📜  在文件中执行字符串替换的 Shell 脚本

📅  最后修改于: 2022-05-13 01:57:27.569000             🧑  作者: Mango

在文件中执行字符串替换的 Shell 脚本

字符串替换是将特定代码块、文本或整个文件中的字符串替换为另一个字符串的过程。在某些情况下,我们需要将一个字符串替换为另一个字符串,但此类字符串的实例很多。这里有两种解决方案;您可以手动一个一个地替换所有字符串,或者编写一些命令一次将一个字符串替换为另一个字符串。后一种解决方案减少了工作量并节省了时间,并且还提供了一些 Linux 命令和实用程序的机会。

方法

在文件中替换字符串的方法非常简单明了。我们需要输入文件名、现有字符串和用户要替换的新字符串。我们可以替换整个文件中的字符串或开始和结束行提到的特定部分。因此,为此,我们需要一个 if-else 条件来检查整个文件字符串替换或特定部分。我们将使用 sed 命令进行实际替换。最后,打印文件中的更改。

解释

我们需要分块解决问题。首先,用户输入替换字符串,然后选择块或整个文件中的替换。使用 SED 命令实际替换字符串并最终打印出文件。

用户输入

首先,我们需要将要执行字符串替换操作的文件的名称。此外,我们需要在文件中输入要替换的实际字符串。我们将使用 read函数提示用户适当的消息并将其存储在变量中。

#!/bin/bash
read -p "Enter the file name : " file
read -p "Enter the old string to be replaced : " old
read -p "Enter the new string to be replaced : " new

更换选择(如果/否则)

在字符串和文件输入之后,我们需要提示用户替换整个文件中或文件中特定行之间的字符串。为此,我们可以使用 if-else 条件语句。首先,我们将替换整个文件中的字符串,作为是/否问题。如果是,则替换整个文件中的字符串,否则输入需要替换字符串的文件的开始和结束行。



#!/bin/bash
read -p "Enter the file name : " file
read -p "Enter the old word to be replaced : " old
read -p "Enter the new word to be replaced : " new

echo -e "\nFile" $file "before replacement\n\n" 
echo -e '\n... Opening' $file ' ...\n\n'
cat $file
echo -e '\n'

read -p "Do you want to replace the string in entire file ? (y/n) : " yn 
if [[ $yn == 'y' || $yn == 'Y' ]]; then
    #replace string in entire file

elif [[ $yn == 'n' || $yn == 'N' ]]; then
    read -p "Enter the line number to start replacement from : " start
    
    # replace string in between mentioned lines only
    read -p "Enter the number of lines after start to end the replacement : " end
else
    echo -e '\nInvalid Input\n'
    echo -e '\nNo changes applied\n'
fi

在上面的代码中,我们制作了一个 if-else 块,提示 a/n 问题并相应地进行替换。下一节将介绍替换文件中字符串的主要方面。

SED 命令

sed 命令代表流编辑器,是一种非常强大的工具,可以使用命令快速编辑文件或文本,而无需打开文本编辑器。这将是替换字符串操作的主要方面。我们现在可以使用以下格式的 sed 命令用新字符串替换旧字符串:

sed -i "s|$old|$new|g" $file

上面是一个SED命令,它取bash中的三个变量,替换整个文件中的字符串。 -i 参数直接更改最后提供的原始文件名。 s 关键字指定以下命令中执行的操作是替换。 g 参数表示沿整行应用替换。我们还可以使用以下格式指定仅对指定行进行的更改:

sed -i "4,+7 s|$old|$new|g" $file

上面的命令替换了从第 4 行到第 11 行(4+7=11 行)的字符串。可以根据用例使用 sed 命令并作为对等替换。上面的命令从行号开始并停止,直到计数器达到减一的值,即计数器是一个基于 0 的索引。如果只想替换单行,可以使用行号+0 表示仅一行,以此类推。

最后,我们将打印替换后的文件并结束脚本。此外,如果输入无效,则打印错误。

脚本

#!/bin/bash
read -p "Enter the file name : " file
read -p "Enter the old word to be replaced : " old
read -p "Enter the new word to be replaced : " new

echo -e "\nFile" $file "before replacement\n\n" 
echo -e '\n... Opening' $file ' ...\n\n'
cat $file
echo -e '\n'

read -p "Do you want to replace the string in entire file ? (y/n) : " yn 
if [[ $yn == 'y' || $yn == 'Y' ]]; then
    sed -i "s|$old|$new|g" $file

elif [[ $yn == 'n' || $yn == 'N' ]]; then
    read -p "Enter the line number to start replacement from : " start
    read -p "Enter the number of lines after start to end the replacement : " end
    sed -i "$start,+$end s|$old|$new|g" $file
else
    echo -e '\nInvalid Input\n'
    echo -e '\nNo changes applied\n'
fi
echo -e '\n... Opening' $file ' ...\n\n'
cat $file
echo -e '\n'

上面的脚本可以完全替换文件中的字符串,也可以要求替换一系列行。 sed 命令与 new、old 等变量一起使用,它们是字符串,以及 start 和 end,它们是用于替换文件中文本的行数。

脚本截图

在上面的屏幕截图中,整个文件中的“win”字符串被替换为“new”。脚本在替换之前和之后打印文件以供用户参考。

在上面的屏幕截图中,“fold”字符串仅在从 4 到 6 的 3 行上替换为“gold”。因此,替换在整个文件和行之间都有效。

因此,从上述脚本中,我们能够替换文件中的字符串。如果未找到输入字符串,则不会更改文件内容并按原样返回。