在 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
s
ubstitute 命令将把一行中的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