2

我的降价文件格式如下

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 程序)

我找到了限制文件中每个单词的解决方案,但我不确定如何将其限制为特定行或如何包含 words-connected-with-dashes-instead-of-whitespace

4

2 回答 2

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
于 2013-01-27T23:18:38.810 回答
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 生锈了,我敢肯定有人会将它折叠成一个称为参数的单行。

于 2013-01-27T23:54:35.430 回答