マークダウンリンクのURLを編集

マークダウンリンクのURLを編集

マークダウンファイルを修正しようとしています。ファイルにはこのようなリンクがたくさんあります。

[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_flagsforを使用します。seds/needle/pin/flags/

sed検索はこの式を使用して実行され、\(\[[^]]*]\)(/\([^#]*\)/\(#[^)]*\))次のように分類されます。

  • \(\[[^]]*]\)- グループ1の定義(リンクタグ):
    • 文字通りの意味[
    • その後は0個以上]
    • 文字通りの意味が続く。]
  • (/- 文字通りの意味(/
  • \([^#]*\)- グループ2の定義(URL):
    • 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、貪欲ではない文字シーケンスをに、$12番目の/スラッシュを、$2octothorpe 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#

https://docs.raku.org/言語/regexes
https://raku.org

関連情報