正規表現と sed を使用した検索と置換 [閉じる]

正規表現と sed を使用した検索と置換 [閉じる]

ファイルで見つけて置き換えようとしています。

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つです。

第二に、rinはファイルを読み取るコマンドremote_pathです。私はそれが少なくともというsed名前のファイルを見つけると確信しています。どちらの場合も、ファイルが存在しない場合はエラーで終了しません。emote_paths/.*[\/]([^\"]*)/$BRANCH_NAME/gemote_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まず、そのオプションなしで試してみてください。

関連情報