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
要进行替换的行。嗯。谢谢