如何更改 grep 后找到的文本旁边的文本?

如何更改 grep 后找到的文本旁边的文本?

在 Linux 环境中,例如我有一个文件 test1,其中包含以下文本:

DB_UP
sqlplus DB_UP test1.sql
DB_UP

我只想删除 sqlplus 旁边的 DB_UP。如何在我真正想要编辑的行之前和之后具有不定数量的 DB_UP 的多个文件中执行此操作?

我尝试使用 xarg -i 但它也删除了 sqlplus 之前和之后的 DB_UP。

我希望输出是:

DB_UP
sqlplus test1.sql
DB_UP

答案1

sed substitute 命令将把一行中的s/DB_UP//第一行替换DB_UP为空(换句话说,将其删除)。

现在您只想对以 开头的行执行此操作sqlplus,因此请用作^sqlplus命令的地址(条件)s/^sqlplus/s/DB_UP//。将^图案锚定到行的开头。

检查您的sed版本是否支持-i交互式更改文件的选项,然后您可以循环遍历要更改的文件并应用脚本

sed -i '/^sqlplus/s/DB_UP//' file1 file2 file3

某些sed版本强制您在-i.如果您担心弄乱事情,这可能是个好主意,但在确保一切正常后,您可能需要删除备份文件。

答案2

DB_UP假设每行只有一个实例,我将使用:

sed 's/\(^.*\)\(DB_UP\)\(.*\)$/\1\3/'

如果您需要替换所有文件内容,@berndbausch bash 循环将完美工作:

for file in f1 f2 f3 f3 f4; do
    sed -i.bak 's/\(^.*\)\(DB_UP\)\(.*\)$/\1\3/' "$file"
done

答案3

awk

   awk '/sqlplus\s{1,}DB_UP/{gsub(/sqlplus\s{1,}DB_UP/, "sqlplus");print; next}1' file

gsub()函数取代了DB_UP后面的函数sqlplus 空白。

这可以缩短为以下命令:

awk '{gsub(/sqlplus  *DB_UP/, "sqlplus")}1' file

相关内容