Sed将特定行中的每个单词大写

Sed将特定行中的每个单词大写,sed,capitalize,Sed,Capitalize,我的降价文件格式如下 chapter one Blah, blah, blah. chapter one-hundred-fifty-three 还有格式化为 CHAPTER ONE Blah, blah, blah. CHAPTER ONE-HUNDRED-FIFTY-THREE 在这两种情况下,我都想将章节行大写 # Chapter One Blah, blah, blah. # Chapter One-Hundred-Fifty-Three 我想使用sed(或者awk,或者可能是其

我的降价文件格式如下

chapter one
Blah, blah, blah.
chapter one-hundred-fifty-three
还有格式化为

CHAPTER ONE
Blah, blah, blah.
CHAPTER ONE-HUNDRED-FIFTY-THREE 
在这两种情况下,我都想将章节行大写

# Chapter One
Blah, blah, blah.
# Chapter One-Hundred-Fifty-Three
我想使用sed(或者awk,或者可能是其他一些管道输入和输出的linux-cli程序)


我已经找到了将文件中的每个单词都加上上限的解决方案,但我不确定如何将其限制在特定的行中,或者如何使用
GNU-sed
将与破折号连接的单词包括在内,使用
GNU-sed

,使用地址(指示目标行号)告诉它将替换应用到所需的行。例如,要将替换应用于第一行,请执行以下操作:

sed -r '1s/(\w)(\w*)/\U\1\L\2/g' file
要将替换应用于第三行,请执行以下操作:

sed -r '3s/(\w)(\w*)/\U\1\L\2/g' file
要将替换应用于第一行和第三行,请执行以下操作:

sed -r -e '1s/(\w)(\w*)/\U\1\L\2/g' -e '3s/(\w)(\w*)/\U\1\L\2/g'
如果您不介意修改第二行,可以使用地址范围:

sed -r '1,3s/(\w)(\w*)/\U\1\L\2/g'
编辑:

根据以下评论:

sed -r '/^chapter/I { s/^/# /; s/(\w)(\w*)/\U\1\L\2/g }' file
结果:

# Chapter One
Blah, blah, blah.
# Chapter One-Hundred-Fifty-Three
# Chapter One
Blah, blah, blah.
# Chapter One-Hundred-Fifty-Three

我将在Perl中执行类似的操作:

#!/usr/bin/perl

while(<>) {
  if(/^chapter/i) {
    $_ = join " ", map ucfirst, split / /, lc;
    $_ = join "-", map ucfirst, split /-/;
  }
  print;
}
#/usr/bin/perl
while(){
如果(/^第/i章){
$联合“”,映射ucfirst,拆分/,lc;
$\=联接“-”,映射ucfirst,拆分/-/;
}
印刷品;
}

可以这样称呼它,例如
perl脚本大写文本
。我的Perl fu是一个很好的工具,但是已经生锈了,我相信有人会把它折叠成一行,称为参数。

因为这些是巨大的文件(书籍),我不知道它们将出现在哪一行。我只剩下“^chapter”了on@roguesith,史蒂夫给了你正确的答案。请接受他的回答以奖励他。此外,此代码使用GNU扩展,因此如果它不适用于您,请告诉我们。@roguesith:您可以使用模式作为地址来告诉
sed
要进行替换的行。嗯。谢谢