Bash Sed替换将字符放在行开头的反向引用之后
我有一个文本文件,我正试图转换为一个Latex文件进行打印。第一步是浏览并更改以下行: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
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"}"}'
结果: