同じ行にあるテキストファイル(別のディレクトリにある)の複数のパターンを一致させ、一致する行を次の行にコピーし、コピーした行を変更したいと思います。 「businessServices」または「BusinessServices」文字列を含むすべての行をコピーしたいです。一致させるパターンが行のどこに表示されるかは関係ありません。ファイルをその場で編集したいです。追加する必要がある行は、次のグローバル置換です。
s#businessServices#userServices#g and s#validate#test#g
s#BusinessServices#UserServices#g
s#BUSINESS_SERVICES#USER_SERVICES#g
ファイル1:
name="businessServices" value="validate"
必須書類1:
name="businessServices" value="validate"
name="userServices" value="test"
ファイル2:
public static final String BUSINESS_SERVICES = "businessServices";
必須書類2:
public static final String BUSINESS_SERVICES = "businessServices";
public static final String USER_SERVICES = "userServices";
ファイル3:
import com.my.ClientBusinessServicesRequest;
import com.my.ClientBusinessServicesResponse;
ClientBusinessServicesRequest clientBusinessServicesRequest = new ClientBusinessServicesRequest();
ClientBusinessServicesResponse clientBusinessServicesResponse = new ClientBusinessServicesResponse();
必須書類3:
import com.my.ClientBusinessServicesRequest;
import com.my.ClientBusinessServicesResponse;
import com.my.ClientUserServicesRequest;
import com.my.ClientUserServicesResponse;
ClientBusinessServicesRequest clientBusinessServicesRequest = new ClientBusinessServicesRequest();
ClientBusinessServicesResponse clientBusinessServicesResponse = new ClientBusinessServicesResponse();
ClientUserServicesRequest clientUserServicesRequest = new ClientUserServicesRequest();
ClientUserServicesResponse clientUserServicesResponse = new ClientUserServicesResponse();
file3は実際には望んでいません(file3が望むことを達成するのが難しい場合)。
import com.my.ClientBusinessServicesRequest;
import com.my.ClientUserServicesRequest;
import com.my.ClientBusinessServicesResponse;
import com.my.ClientUserServicesResponse;
ClientBusinessServicesRequest clientBusinessServicesRequest = new ClientBusinessServicesRequest();
ClientUserServicesRequest clientUserServicesRequest = new ClientUserServicesRequest();
ClientBusinessServicesResponse clientBusinessServicesResponse = new ClientBusinessServicesResponse();
ClientUserServicesResponse clientUserServicesResponse = new ClientUserServicesResponse();
私は次の方法を試しましたが、それぞれ希望の結果のいくつかを得ましたが、すべてではありません。
grep -rl businessServices . | xargs sed -i 's#\(.*\)validate\(.*\)#&\n\1test\2#'
grep -rl businessServices . | xargs sed -i 's#\(.*\)businessServices\(.*\)#&\n\1userServices\2#'
grep -rl BusinessServices . | xargs sed -i 's#\(.*\)BusinessServices\(.*\)#&\n\1UserServices\2#g'
grep -rli businessServices . | xargs sed -i 's#\(.*\)BUSINESS_SERVICES\(.*\)#&\n\1USER_SERVICES\2#'
ベストアンサー1
自動印刷(-n)および内部編集(-i)なしで拡張正規表現モード(-E)でGNU sedを使用します。
sed -Eni '
/[bB]usinessServices|BUSINESS_SERVICES/{
h
:loop
${g;bend;}
n
//{H;bloop;}
x
:end
p'"
$(< cmds.sed)
"'
$!G
}
p
' file3
- OR正規表現を使用して必要な行を選択してください。
- その後、ループを開始して、所望の連続行を保留状態に保存する。
- 保留状態に保存された一連の連続ラインを印刷します。
- 次に、ファイル(cmds.sed)に保存されているsedコマンドを挿入して交換を実行します。
- 変更されたファイル+保持された内容を印刷します。
cmds.sedファイルの内容:
$ cat cmds.sed
s#businessServices#userServices#g
s#validate#test#g
s#BusinessServices#UserServices#g
s#BUSINESS_SERVICES#USER_SERVICES#g