マイドキュメントに.toc
(カタログファイル)があります.tex
。
これには多くの行が含まれており、その一部は次の形式です。
\contentsline {part}{Some title here\hfil }{5}
\contentsline {chapter}{\numberline {}Person name here}{5}
私はgrep
存在する方法part
と存在する方法を知っていますchapter
。しかし、この行をフィルタリングして、次csv
のファイルに出力を保存したいと思います。
{Some title here},{Person name here},{5}
それとも校正器がないか
Some title here,Person name here,5
1.もちろん、最後のペアの数字(ページ番号)は両方の行と{}
同じであるため、2行目だけをフィルタリングできます。
2.空のペアがあって{}
も、他のペアも含まれている場合があります{}
。たとえば、次のようになります。
\contentsline {part}{Title with math $\frac{a}{b}$\hfil }{15}
フィルタリングする必要があります
Title with math $\frac{a}{b}$
編集1:以下を使用して、行の末尾に中括弧なしで数字を取得できます。
grep '{part}' file.toc | awk -F '[{}]' '{print $(NF-1)}'
編集2:chapter
ラインをフィルタリングしてジャンクを削除できます。
grep '{chapter}' file.toc | sed 's/\\numberline//' | sed 's/\\contentsline//' | sed 's/{chapter}//' | sed 's/{}//' | sed 's/^ {/{/'
空白のない出力は次のとおりです。
{Person name here}{5}
編集3:part
出力をフィルタリングして整理できました
\contentsline {chapter}{\numberline {}Person name here}{5}
返品
{Title with math $\frac{a}{b}$}{15}
ベストアンサー1
これはGNUを使用していますがawk
、awk
POSIXを使用するのが面倒です(欠けていてgensub
2回以上使用しました)。
#!/usr/bin/env gawk
function join(array, result, i)
{
result = array[0];
end = length(array) - 1;
for (i = 1; i <= end; i++)
result = result "," array[i];
return result;
}
function push(arr, elem)
{
arr[length(arr)] = elem;
}
# split("", arr) is a horribly unreadable way to clear an array
BEGIN { split("", arr); }
/{part}|{chapter}/ {
l = gensub(".*{(.+)}{(.+)}{([0-9]+)}$", "\\1,\\3,\\2", "g");
if ("part" == substr(l, 0, 4)) {
if (length(arr) > 0) { print join(arr); }
split("", arr);
push(arr, gensub("^(.*),(.*),(.*)$", "\\2,\\3","g", l));
} else {
push(arr, gensub("^(.*),(.*),(.*)$", "\\3","g", l));
}
}
END { print join(arr); }
これは正規表現が貪欲であることを利用するので、一致は毎回行全体を取得します。最初に考えたよりもはるかに多くの努力が必要でした。
次のように入力します。
\contentsline {part}{Some title here\hfil }{5}
\contentsline {chapter}{\numberline {}Person name here}{5}
blah blah
\contentsline {chapter}{\numberline {}Person name here}{5}
blah blah
blah blah
\contentsline {chapter}{\numberline {}Person name here}{5}
\contentsline {chapter}{\numberline {}Person name here}{5}
blah blah
blah blah
\contentsline {chapter}{\numberline {}Person name here}{5}
\contentsline {chapter}{\numberline {}Person name here}{5}
\contentsline {part}{Some title here\hfil }{7}
\contentsline {chapter}{\numberline {}Person name here}{7}
blah blah
blah blah
\contentsline {chapter}{\numberline {}Person name here}{7}
blah blah
\contentsline {part}{Some title here\hfil }{9}
blah blah
blah blah
\contentsline {chapter}{\numberline {}Person name here}{9}
私達は次を作り出しますcat input | awk -f the_above_script.awk
:
5,Some title here\hfil ,\numberline {}Person name here,\numberline {}Person name here,\numberline {}Person name here,\numberline {}Person name here,\numberline {}Person name here,\numberline {}Person name here
7,Some title here\hfil ,\numberline {}Person name here,\numberline {}Person name here
9,Some title here\hfil ,\numberline {}Person name here
ページ番号は、埋め込み後に発生する{part}
すべての情報から取得されます。これにより、本の一部に複数の章を含めることができます。{chapter}
{part}