我有缩写文件格式化
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程序)
我找到了解决方案来限制文件中的每个单词,但我不确定如何将其限制为特定行或如何包含单词连接 - 破折号 - 而不是空格
答案 0 :(得分:2)
使用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
答案 1 :(得分:0)
我会在Perl中做类似的事情:
#!/usr/bin/perl
while(<>) {
if(/^chapter/i) {
$_ = join " ", map ucfirst, split / /, lc;
$_ = join "-", map ucfirst, split /-/;
}
print;
}
将此称为例如perl script < input-text > capitalized-text
。我的Perl-fu是一个但是生锈的,我相信有人会将它折叠成一个被称为参数的oneliner。