部分一致正規表現をsedまたは他のツールに置き換える

部分一致正規表現をsedまたは他のツールに置き換える

特定の正規表現に一致するファイル部分の文字を置き換える必要があります。正確に言えば、-間違ったマークダウンリンクからスペースを削除する必要があります。たとえば、次のようになります。

[This is my link](actual bad link.md)

次のようにする必要があります。

[This is my link](actual-bad-link.md)

(正規表現で始まり終わる項目をsedで一致させることはできますが、一致する式.md)で空白のみを変更するようにsedに指示する方法がわかりません。これを行う方法はありますか(おそらくawkなどの他のコマンドラインツールを使用して)?

ありがとうございます。

(編集:最小化のために、および.md)間のすべてのスペースを変更するコマンドに満足します-

ベストアンサー1

1行に1つのインスタンスに対して入れ子の括弧なしで、次のようにしてmatch同様の操作を実行できますsubstr

$ echo '[This is my link](actual bad link.md) other stuff' | awk '
    match($0,/\([^)]*\.md\)/){
      s = substr($0,RSTART,RLENGTH); gsub(/ /,"-", s); 
      print substr($0,1,RSTART-1) s substr($0,RSTART+RLENGTH)}
  '
[This is my link](actual-bad-link.md) other stuff

GNU awkには、一致するグループを配列としてキャプチャする非標準の拡張機能がありますが、私の考えではここではあまり役に立ちません。

ループを介してグローバル置換を実行できますが、matchおそらくPerlはより良い選択でしょう。

$ echo '[This is my link](actual bad link.md) other stuff' | perl -pe '
    s{(\(.*?\.md\))}{$1 =~ s/ /-/gr}ge
  '
[This is my link](actual-bad-link.md) other stuff

おすすめ記事