2017-03-04 9 views
1

印刷のためにLatexファイルに変換しようとしているテキストファイルがあります。以下のように見えるようにSed置換は、行の先頭に後ろ参照の後に文字を配置します。

Book 01  Introduction 

:最初のステップの一つが通過するとのように見えるラインを変更することです

:このためには

\chapter{Introduction} 

、私は非常に単純なsedスクリプトを考案しました

sed -n -e 's/Book [[:digit:]]\{2\}\s*(.*)/\\chapter{\1}/p' 

これは、最初のバックスラッシュが置換された出力にあるはずのところに、中かっこが置かれていることを除いて、この作業を行います。そうですね:

}chapter{Introduction 

このような理由は何ですか?

答えて

0

解決策は、キャプチャグループを変更することです。この場合、すべての書籍の章名は英字のみで構成されているので、[[:alpha:]]*を使用することができました。これにより、sedスクリプトの改訂版が提供されました。

sed -n -e 's/Book [[:digit:]]\{2\}\s*\([[:alpha:]]*\)/\\chapter{\1}/p'. 
3

sedへの電話は問題ありません。問題はファイルがDOSの行末(CRLF)を使用していますが、sedはCRを行末の一部として認識するのではなく、行の別の文字として認識することです。ストリングIntroduction\rが捕捉され、その結果\chapter{Introduction\r}キャリッジリターンにすべてを印刷することによって印刷さ

\chapter{Introduction 
        ^

は、行の先頭にカーソルを移動させる(^カーソル位置を表す)

\chapter{Introduction 
^ 

その後、既に印刷されているもの以上の結果(})の残りの部分を印刷

}chapter{Introduction 
^ 

解決方法は、標準のPOSIX行末(改行のみ)を使用するようにファイルを修正するか、正規表現を変更して改行をキャプチャしないようにすることです。 sedに対する代替として

sed -n -e 's/Book [[:digit:]]\{2\}\s*(.*)\r?$/\\chapter{\1}/p' 
2

awkgsubを使用すると、このような状況でうまくいくかもしれません:

awk '{gsub(/Book [0-9]+/,"\\chapter"); print $1"{"$2"}"}' 

結果

\chapter{Introduction} 
関連する問題