マークダウンファイルを修正しようとしています。ファイルにはこのようなリンクがたくさんあります。
[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試合後
)
答え2
\1
一致するグループには's/](\(\/.*\)#/](\1.html#/g'
スラッシュが含まれています。\/
グループ外で指定する必要があります\(\/.*\)
。この試み:
sed -i 's/](\/\(.*\)\/#/](\1.html#/g' file
答え3
使用幸せ(以前のPerl_6)
~$ raku -pe 's{ \( ~ \) [(\/) ( .+? ) (\/) (\# .+ )] $ } = "($1.html$3)";' 725364.in
#OR(もっと格式を身につける)
~$ raku -pe 's{ \( ~ \) [(\/) ( <-[#]>+? ) (\/) (\# <-[#]>+ )] $ } = "($1.html$3)";' 725364.in
入力例(@DopeGhotiのおかげで):
[string one](/stringtwo/#stringthree)
[example label](/path/to/doc/#anchor)
出力例:
[string one](stringtwo.html#stringthree)
[example label](path/to/doc.html#anchor)
OPは/
スラッシュを変更したいので、s///
通常のRaku代替構文とは異なる構文が使用されました。 Rakuは、s{ … } = " … "
上記で使用されている代替構文(またはなど)も提供しますs[ … ] = " … "
。
最初の原子では、~
Rakuの入れ子になったデータ構造のチルダ構文が使用されます。デフォルトでは、正規表現は次のように\( ~ \) [ … ]
言います。「角かっこ内のグループは角かっこで囲まれています。」。次に、正規表現は/
スラッシュをに$0
、貪欲ではない文字シーケンスをに、$1
2番目の/
スラッシュを、$2
octothorpe intoで始まる端末貪欲な文字シーケンスをキャプチャします。#
$3
キャプチャの表示(-pe
フラグを次に変更して-ne
追加say
):
~$ perl6 -ne 'say s{ \( ~ \) [(\/) ( .+? ) (\/) (\# .+ )] $ } = "($1.html$3)";' 725364.in
「(/stringtwo/#stringthree)」
0 => 「/」
1 => 「stringtwo」
2 => 「/」
3 => 「#stringthree」
「(/path/to/doc/#anchor)」
0 => 「/」
1 => 「path/to/doc」
2 => 「/」
3 => 「#anchor」
代わりに捕捉されていない括弧が復元されます。キャプチャされた/
スラッシュは削除されます。キャプチャされたパス$1
とキャプチャされたオクトソフが実行された端末文字列を出力.html
します。$3
#