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コマンドは、1行の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_UP1行に1つのインスタンスしかないと仮定すると、次のようになります。

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

関連情報