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

时间:2013-01-27 23:01:09

标签: 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或者其他一些管道输入和输出的linux cli程序)

我找到了解决方案来限制文件中的每个单词,但我不确定如何将其限制为特定行或如何包含单词连接 - 破折号 - 而不是空格

2 个答案:

答案 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。