
次のようなテキストがあります:
Table {\label{seq:ref176}} - Table name.
\begin{longtable}{|m{3.36636in}|m{3.36636in}|}
次のように編集したいです:
\begin{longtable}{|m{3.36636in}|m{3.36636in}|}
\caption{Table name \label{seq:ref176}}\\
これを次のように実行できますAtom
:
探す:Table \{\\label\{(.*?)\}\} - (.*?).\n*\\begin\{longtable\}\{(.*?)\|\}
交換する:\begin{longtable}{$3|}\n\\caption {$2 \\label{$1}}\\\\
これを sed で実行しようとしましたが、機能しません。エラーはありません。一致するものが見つからないだけです。
s/Table\ \{\\label\{(.*?)\}\}\ \-\ (.*?)\n*\\begin\{longtable\}\{(.*?)\|\}/\\begin\{longtable\}\{\3\|\}\n\\caption\ \{\2\ \\label\{\1\}\}\\\\/g
答え1
Perl ワンライナーが選択肢にある場合は、以下を試してください。
perl -0777 -pe 's/Table \{(\\label\{.*?\}\}) - (.*?)\.\s+(\\begin\{longtable\}\{.*?\|\})/$3\n\\caption{$2 $1/' file
\begin{longtable}{|m{3.36636in}|m{3.36636in}|}
\caption{Table name \label{seq:ref176}}
答え2
あなたの試行には概念的なエラーが 1 つと軽微なエラーが 1 つあります。
のコンセプトはsed
、ファイルを 1 行ずつ処理することです (デフォルト)。幸いなことに、GNU sed は、パラメータが渡されるとファイル全体を処理できます-z
。
小さな修正は、\.
目的の出力を得るために欠落している部分を追加することです。表現が長すぎて乱雑な場合、このような些細な点を見つけるのは非常に難しいので、あなたを責めるつもりはありません。
コマンドライン:
sed -rz 's/Table\ \{\\label\{(.*?)\}\}\ \-\ (.*?)\.\n*\\begin\{longtable\}\{(.*?)\|\}/\\begin\{longtable\}\{\3\|\}\n\\caption\ \{\2\ \\label\{\1\}\}\\\\/g' file
出力:
\begin{longtable}{|m{3.36636in}|m{3.36636in}|}
\caption {Table name \label{seq:ref176}}\\
参照GNU sedからドキュメンテーション:
'-z'
'--null-data'
'--zero-terminated'
Treat the input as a set of lines, each terminated by a zero byte
(the ASCII 'NUL' character) instead of a newline. This option can
be used with commands like 'sort -z' and 'find -print0' to process
arbitrary file names.
答え3
Python ではファイル全体を扱う方が簡単なので、python
ではなく でスクリプトを記述することを好みました。sed
#!/usr/bin/python
import re
import argparse
def test_regex(input):
with open(input) as f:
data = f.read()
file = open("output.tex","w")
file.write(data)
file.close()
data = re.sub(r'Table \{\\label\{(.*?)\}\} - (.*?).\s*\\begin\{longtable\}\{(.*?)\|\}',
r'\\begin{longtable}{\3|}\n\\caption {\2 \\label{\1}}\\\\', data)
file = open("output.tex","w")
file.write(data)
file.close()
def main(input):
test_regex(input)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("input")
args = parser.parse_args()
input = args.input
main(input)