マークダウンファイルを修正しようとしています。ファイルにはこのようなリンクがたくさんあります。
[string one](/stringtwo/#stringthree)
私はそれらを次のように変更したいと思います:
[string one](stringtwo.html#stringthree)
スラッシュを削除して.html
。
私は以下を試しました:
sed -i 's/](\(\/.*\)#/](\1.html#/g' file
しかし帰ってきた[global configuration](/config/.html#globals)
。スラッシュは削除されません。
bash
またはを使用してどのようにこれを達成できますかsed
?
ベストアンサー1
これはトリックを行うようです
$ cat 725364.in
[string one](/stringtwo/#stringthree)
[example label](/path/to/doc/#anchor)
$ sed 's_\(\[[^]]*]\)(/\([^#]*\)/\(#[^)]*\))_\1(\2.html\3)_g' 725364.in
[string one](stringtwo.html#stringthree)
[example label](path/to/doc.html#anchor)
それを破壊する:
まず、リテラルsの脱出を避けるためにsoの代わりにs_needle_pin_flags
forを使用します。sed
s/needle/pin/flags
/
sed
検索はこの式を使用して実行され、\(\[[^]]*]\)(/\([^#]*\)/\(#[^)]*\))
次のように分類されます。
\(\[[^]]*]\)
- グループ1の定義(リンクタグ):- 文字通りの意味
[
- その後は0個以上
]
- 文字通りの意味が続く。
]
- 文字通りの意味
(/
- 文字通りの意味(/
\([^#]*\)
- グループ2の定義(URL):- 0個以上の非リテラルコンテンツ
#
- 0個以上の非リテラルコンテンツ
/
- 文字通りの意味/
\(#[^)]*\)
- グループ3(アンカー)の定義:- 文字通りの意味
#
- その後、ゼロ以上のテキスト以外のコンテンツが続きます。
)
- 文字通りの意味
)
- 文字通りの意味)
以下を使用して変換します\1(\2.html\3)
。
- グループ1の試合に続き
(
、続いて- グループ2の試合に続き
.html
、続いて- グループ3試合後
)