web-dev-qa-db-ja.com

コンテンツを保持しながら特定のコマンドを括弧/括弧で置き換える(CLI)

_plain text_のようなLaTeXコマンドを含む_\hspace{5cm}_ファイルがあります。このファイルを_.odt_に変換すると、カスタムコマンドの一部が正しく変換されません。 specificコマンドを自動的に検索して置換したいが、括弧の内容は保持したい(つまり、ほとんどのコマンドを保持し、一部を削除したい)。 geditを開いて手動で置換を行うことができることは知っていますが、これは繰り返しの自動置換のためのスクリプト用です。

私はすでにこれを検索しましたが、コンテンツを保持しながら括弧を削除する回答のみを見つけました(cf. here 、here))。また、sedのいくつかの紹介(例: here または here )も成功しませんでした。

例:

_This is my \textbf{text} where there are about \prc{5} commands, i.e. \mErrRange{30}{20}{m}._

したがって、これらは割合とエラー範囲であるため、コマンドと中括弧を削除して、次のようなものを取得したい(_\textbf{...}_コマンドを保持する):

_This is my \textbf{text} where there are 5 % commands, i.e. 30 ± 20 m._

これまでに試したこと:

次のようなさまざまな使用方法sed

sed -i -e 's/\\prc{\(.*\)}/\1%/g' hello.txt

これはすでに私に与えます:

_This is my \textbf{text} where there are about 5} commands, i.e. \mErrRange{30}{20}{m%._

(行内の最後の中括弧を置き換えますが、その場所に他の括弧を残します。)

だから、今、私はそれを続ける方法がわかりません。おそらくsed?の代わりに別のツールを使用する必要があります! Ubuntuで&terminalで実行している提案のうち、あまりインストールしなくても良いと思う。

1
bamphe

方法は次のとおりです。

sed 's/\\prc{\([^}]*\)}/\1 %/g'

これにより、\prcに続く括弧内のすべてがキャプチャされ、グループ1に保存されます。これを使用して、コマンドを括弧の内容に置き換えることができます。 [^}]*は、ここで閉じ括弧を除くすべてを単純に取ります。 gは「グローバル」を表し、最初のパターンだけでなく、行内のパターンのすべての出現を置換することを意味します。これは、すべての式で必要になります。

もう1つは、複数のグループを使用するだけです。

sed 's/\\mErrRange{\([^}]*\)}{\([^}]*\)}{\([^}]*\)}/\1 ± \2 \3/g'

これらの式は好きなだけ組み合わせることができますが、簡単にはわかりません。次のように、1行に1つの式を持つsedスクリプトを作成することをお勧めします。

#!/bin/sed -f
s/\\prc{\([^}]*\)}/\1 %/g
s/\\mErrRange{\([^}]*\)}{\([^}]*\)}{\([^}]*\)}/\1 ± \2 \3/g

例として保存しますscript.sedchmod +x /path/to/script.sedで実行可能にし、/path/to/script.sedで実行します。

実行例

$ /path/to/script.sed <hello.txt
This is my \textbf{text} where there are about 5 % commands, i.e. 30 ± 20 m.

シェルが可能な限り頻繁に入力ファイルを開くようにしました。したがって、<hello.txt(これも機能します!)の代わりにhello.txtを開きます。あなたがこれが正確に何を持っているかに興味があるなら、私は nix.SEに関するこの答え をお勧めします。

1
dessert