ファイルで見つけて置き換えようとしています。
echo "$BRANCH_NAME" >> "$WORKING_DIR"/test.text
sed -i '' "remote_paths/.*[\/]([^\"]*)/$BRANCH_NAME/g" "$WORKING_DIR"/sftp-config.json
...スクリプトが正常に作成およびtest.text
印刷されたため、BRANCH_NAME
これまでは正常に動作しています。ただし、検索と置換操作は実行できません。
質問がある場合、正規表現の出力は次のようになります。
Full match `remote_path": "/home/myname/public_html/ABC-1271`
Group 1. `ABC-1271`
簡単に言えば、これが私が達成したいものです:
ABC-1271
検索ひも remote_path": "/home/myname/public_html/ABC-1271
~の文書 sftp-config.json
そして()ABC-1271
に変更してください。XYZ-1225
$BRANCH_NAME
答え1
注文sed
が少し混乱しています。
sed -i '' "remote_paths/.*[\/]([^\"]*)/$BRANCH_NAME/g"
まず、それでもやりたい場合はwithを使用しないでくださいsed
。-i
これは重要な文書を破棄する方法の1つです。
第二に、r
inはファイルを読み取るコマンドremote_path
です。私はそれが少なくともというsed
名前のファイルを見つけると確信しています。どちらの場合も、ファイルが存在しない場合はエラーで終了しません。emote_paths/.*[\/]([^\"]*)/$BRANCH_NAME/g
emote_paths
あなたは次のようなものが欲しいようです
s#\(remote_path.*/home/myname/public_html/\)\([A-Z0-9-]*\)#\1$BRANCH_NAME#g
コマンドは
sed "s#\(remote_path.*/home/myname/public_html/\)\([A-Z0-9-]*\)#\1$BRANCH_NAME#g" \
"$WORKING_DIR/sftp-config.json" >"$WORKING_DIR/sftp-config.json.new"
または、支店名が行の姓の後の姓であり、/
文字列がremote_path
行を一意に見つける場合:
sed "/remote_path/s#/[^/]*\$#$BRANCH_NAME#" \
"$WORKING_DIR/sftp-config.json" >"$WORKING_DIR/sftp-config.json.new"
ただし、理想的にはJSON対応ツールを使用してこれを行うことをお勧めします。jq
:
jq ".remote_path = (.remote_path | split(\"/\") | .[-1] = \"$BRANCH_NAME\" | join(\"/\"))" \
input.json >output.json
答え2
(1)remote_path
アドレスのようですが、このパターンを使用して行をフィルタリングしますか?その後、スラッシュで囲みます。/remote_path/
(2)行全体の式を作成したように見えますが、表示した部分のみを変更しようとします()
。正しいですか?ただし、これらは非常に異なる方法(グループ化または逆参照)で使用されるため、エスケープするか拡張\(\)
正規-E
表現オプションを使用する必要があります。
(3)大文字と数字の間のダッシュなど、交換するブランチの名前にのみ一致するパターンを見つけます。[A-Z]*-[0-9]*
私たちはついに得ます
sed -i '' "/remote_path/s/[A-Z]*-[0-9]*)/$BRANCH_NAME/g" "$WORKING_DIR"/sftp-config.json
-i
まず、そのオプションなしで試してみてください。