部分一致正規表現を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

答え2

2つのパラメータを使用するflagsでコマンドを使用できますtr。最初のパラメータは置き換える文字で、2番目のパラメータは置き換える文字です。tr-t

cat data | tr -t " " "-" 

これはすべてのスペースを置き換えますが、-リンクの後半を取り出すのは簡単です。EDIT: Here is aグレブcommand to pull out whats between the()

grep -Po '(?<=\().*(?=\))'

編集:以下は、コアユーティリティを使用してこれを行う方法の例です。スクリプトを短くすることもできます。変数を使って読みやすくしました。grepあるいは、これらのコマンドsedのいずれかをawk使用して同じ出力を生成できます。

data="[This is my link](actual bad link.md)"
r=$(echo $data | grep -Po '(?<=\().*(?=\))')
n=$(echo $data | grep -Po '(?<=\().*(?=\))' | tr -s ' ' '-')
t=$(echo $data | sed "s|${r}|${n}|")

echo $t

関連情報