Grepによる置換

Grepによる置換

次のようなサンプルテキストがあります:

\documentclass[a4paper]{article}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{color}
\setlength{\parindent}{0em}
\setlength{\parskip}{2ex plus1ex minus0.5ex}
\newcommand{\stylea}[1]{\noindent{\textcolor[rgb]{0.9, 0.9, 0.8}{\fcolorbox[rgb]{0, 0, 0}{0.2, 0.2, 0.2}{#1}}}}

\begin{document}
\ttfamily
\setlength{\fboxrule}{0pt}
\setlength{\fboxsep}{0pt}
1 \stylea{\# Author{\hspace*{1em}}: Bhishan Poudel} \\
2 \stylea{\# Date{\hspace*{1em}}{\hspace*{1em}}: May 19, 2016} \\
3 \stylea{} \\
4 \stylea{Line wrapping in geany} \\
5 \stylea{===============================================================================} \\
6 \stylea{edit > preference > editor > features > line wrapping} \\
7 \stylea{then,} \\
8 \stylea{document > line wrapping} \\
\end{document}

{} 内の単語はそのままにして、\stylea{} 内のすべての単語を削除したいと思います。

\stylea{ を検索して置換し、空白に置き換えることができることはわかっていますが、空白は不要であり、同時に閉じ括弧 } も削除したいと考えています。

また、Geany で選択したブロック内の単語のみを置き換えることはできますか? たとえば、行 1 から 8 を選択し、stylea を styleb に置き換える場合はどうでしょうか?

答え1

Grepによる置換

正規表現の検索/置換を使用して、これを(ほとんど)実行できます。

「正規表現を使用する」が選択され、「複数行の一致を使用する」が選択されていないことを確認して、「置換」ダイアログを使用します。

検索する:

\\stylea{(.*)}

次のように置き換えます:

\1

\1これは、検索式内の「キャプチャされた」テキスト (括弧内の部分) への正規表現の「後方参照」です。キャプチャが複数ある場合は、、、\2などで参照できます。

ただし、正規表現には制限があり、それが問題を引き起こす可能性があることに留意してください。次のように、テキスト内に中括弧がネストされている行がいくつかあります。

\stylea{\# Date{\hspace*{1em}}{\hspace*{1em}}: May 19, 2016}

{}正規表現は、このようにネストされた区切り文字 ( ) を (それ自体では) カウントして一致させる(.*)ことはできません。あなたの場合、キャプチャは行末の前にできるだけ多くの文字を一致させるため (「貪欲な一致」)、これは実際には問題にならないかもしれません。あなたのサンプル テキストでは、各\stylea{}タグが 1 行にあるため、これはたまたま正しい動作です。複数行にまたがるタグを持つファイルがある場合\stylea{}、この方法ではテキストが適切に置き換えられません。最善の選択肢は、まずそれらのインスタンスを見つけて、手動で変更するか、複数行にまたがらないようにすることです。

これは、正規表現の検索/置換機能を提供する多くのエディターで動作するはずですが、もちろんダイアログ オプションの詳細は異なります。私はこれを Mac OS X 用の TextWrangler でテストしました。

選択範囲のみを置換

番号の付いた 8 行を選択します。検索:

\\stylea{

次のように置き換えます:

\\styleb{

次に、置換ダイアログの「選択範囲」ボタンをクリックします。

関連情報