
たとえば、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コマンドは、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_UP
1行に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