テキストモードで特定の文字を削除する

テキストモードで特定の文字を削除する

Pandoc形式のcitekeysを含むテキストを含むMarkdownファイルを含むフォルダがあります[@Name:2021]。私のcitekeyからコロンを削除することに決め、マークダウンファイルから自動的に削除したいと思います。 citekey は次の形式を取ることができます。

[@Name:2021]
[@Name:2021, 10]
[@Name:Title]
[Vgl. @Name:2021]
[Vgl. @Name:2021, 20--30]

だから彼らは次のようになります:

[@Name2021]
[@Name2021, 10]
[@NameTitle]
[Vgl. @Name2021]
[Vgl. @Name2021, 20--30]

最近追加した citekey にはコロンが含まれなくなりました。もちろん、形式に^[Text]コロンが含まれているので削除しない脚注もあるかもしれません。

すべてのマークダウンファイルの引用符からコロンを自動的に削除できるコマンドラインユーティリティのコマンド/スクリプトはありますか?ご協力ありがとうございます!

答え1

Perlはここで便利です。代替部分はs///コードで計算できます。

perl -pe 's/\[[^]]*@.+?\]/ ($cite = $&) =~ s{:}{}g; $cite /ge' file

出力

[@Name2021]
[@Name2021, 10]
[@NameTitle]
[Vgl. @Name2021]
[Vgl. @Name2021, 20--30]

出力に満足したら、次のコマンドを使用して変更をファイルに保存し直すことができます。

perl -i -pe ...

答え2

GNUを使用し、現在のディレクトリに隠されていないすべてのファイルにin-place()型のグローバル置換を適用しますsed's/regexp/replacement/g'-i

sed -i -- 's/\(\[[^]@]*@[^]:]*\):\([^]]*\]\)/\1\2/g' *
  • s/交換開始
  • \(最初のキャプチャグループを開く
    • \[リテラルと一致[
    • [^]@]*文字以外の文字]と文字以外の@文字と一致します。
    • @リテラルと一致@
    • [^]:]*文字以外の文字]と文字以外の:文字と一致します。
  • \)最初のキャプチャグループを閉じる
  • :リテラルと一致:
  • \(2番目のキャプチャグループを開く
    • [^]]*]文字以外の文字と一致
    • \]リテラルと一致]
  • \)2番目のキャプチャグループを閉じます。
  • /区切り記号の交換
  • \1\2キャプチャリンググループを含む代替文字列
  • /g最終交換、gグローバル交換

このコマンドを実行する前に、ターゲットディレクトリのバックアップを作成するか、サフィックス付きのソースファイルのコピーを保持するように-i変更してください。選択した diff ツールを使用して、元のファイルを結果と比較します。-i'.bak'.bak

答え3

変更したくない行がで始まる行なら、^次のコマンドが効果があるようです。

sed '/^\^/!s/://' file

答え4

使用perl:

$ perl -lpe 'my($p1, $p2);
    substr($_, $p1, $p2-$p1) =~ s/(@[^:]+):/$1/
      while
        $p1 = 1+index($_, "[", $p2)
                 and
        $p2 = 1+index($_, "]", $p1);
' file
  • [$p1/$p2 は]その後の a 位置です。
  • その後、substr()にブロック開始+ブロック長が渡され、s //コマンドがそのブロックで機能し、現在のレコード$_も更新されます。

出力:

@Name2021]
[@Name2021, 10]
[@NameTitle]
[Vgl. @Name2021]
[Vgl. @Name2021, 20--30]

関連情報