我有一个文本文件,我试图转换为Latex文件进行打印。其中一个步骤是通过并更改看起来像这样的行:
Book 01 Introduction
看起来像:
\chapter{Introduction}
为此,我设计了一个非常简单的sed脚本:
sed -n -e 's/Book [[:digit:]]\{2\}\s*(.*)/\\chapter{\1}/p'
这可以完成这项工作,但是,结束花括号放在初始反斜杠应该在替换输出中的位置。像这样:
}chapter{Introduction
关于为什么会出现这种情况的任何想法?
答案 0 :(得分:2)
您对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'
答案 1 :(得分:1)
作为sed
的替代方案,使用awk
的{{1}}在这种情况下可能效果很好:
gsub
<强>结果强>:
awk '{gsub(/Book [0-9]+/,"\\chapter"); print $1"{"$2"}"}'
答案 2 :(得分:0)
解决方案是修改捕获组。在这种情况下,由于所有书籍章节名称仅由字母字符组成,因此我可以使用[[:alpha:]]*
。这给出了修改后的sed脚本:
sed -n -e 's/Book [[:digit:]]\{2\}\s*\([[:alpha:]]*\)/\\chapter{\1}/p'.