2017-03-04 71 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 -n -e 's/Book [[:digit:]]\{2\}\s*(.*)\r?$/\\chapter{\1}/p' 
2

作爲替代sedawk使用gsub可能在這種情況下工作得很好:

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

結果

\chapter{Introduction}