Bash Sed替换将字符放在行开头的反向引用之后

Bash Sed替换将字符放在行开头的反向引用之后,bash,sed,Bash,Sed,我有一个文本文件,我正试图转换为一个Latex文件进行打印。第一步是浏览并更改以下行: Book 01 Introduction \chapter{Introduction} \chapter{Introduction} 看起来像: Book 01 Introduction \chapter{Introduction} \chapter{Introduction} 为此,我设计了一个非常简单的sed脚本: sed -n -e 's/Book [[:digi

我有一个文本文件,我正试图转换为一个Latex文件进行打印。第一步是浏览并更改以下行:

Book 01        Introduction
\chapter{Introduction}
\chapter{Introduction}
看起来像:

Book 01        Introduction
\chapter{Introduction}
\chapter{Introduction}
为此,我设计了一个非常简单的sed脚本:

sed -n -e 's/Book [[:digit:]]\{2\}\s*(.*)/\\chapter{\1}/p'
这就完成了这项工作,除了在替换输出中初始反斜杠所在的位置放置了右括号。像这样:

}chapter{Introduction

关于为什么会出现这种情况,您有什么想法吗?

解决方案是修改捕获组。在本例中,由于所有书籍章节名称仅由字母字符组成,因此我能够使用
[[:alpha:][]*
。这给出了修订后的sed脚本:

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

您对
sed
的呼叫正常;问题是,您的文件使用DOS行尾(CRLF),但
sed
不将CR识别为行尾的一部分,而仅识别为行上的另一个字符。捕获字符串
Introduction\r
,并通过打印所有内容直到回车来打印结果
\chapter{Introduction\r}
^
表示光标位置)

然后将光标移动到行的开头

\chapter{Introduction
^
然后在已打印的内容上打印剩余结果(
}

}chapter{Introduction
 ^
解决方案是修复文件以使用标准POSIX行尾(仅限linefeed),或者修改正则表达式以不捕获行尾的回车

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

作为
sed
的替代方案,
awk
使用
gsub
在这种情况下可能会很好地工作:

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