sed替换在行

时间:2017-03-04 01:37:37

标签: bash sed

我有一个文本文件,我试图转换为Latex文件进行打印。其中一个步骤是通过并更改看起来像这样的行:

Book 01        Introduction

看起来像:

\chapter{Introduction}

为此,我设计了一个非常简单的sed脚本:

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

这可以完成这项工作,但是,结束花括号放在初始反斜杠应该在替换输出中的位置。像这样:

}chapter{Introduction

关于为什么会出现这种情况的任何想法?

3 个答案:

答案 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'.