Sed использовать каждое слово в определенных строках с заглавной буквы

У меня есть файлы уценки, отформатированные как

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, которая передает ввод и вывод)

Я нашел решения для ограничения каждого слова в файле, но я не уверен, как ограничить его определенными строками или как включить слова, связанные с дефисами, вместо пробелов.


person roguesith    schedule 27.01.2013    source источник


Ответы (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
person Steve    schedule 27.01.2013
comment
Поскольку это огромные файлы (книги), я не знаю, на каких строках они будут. Все, что у меня есть, это ^ глава, чтобы продолжить - person roguesith; 28.01.2013
comment
@roguesith, Стив дал тебе правильный ответ. Пожалуйста, вознаградите его, приняв его ответ. Кроме того, в этом коде используются расширения GNU, поэтому сообщите нам, если он у вас не работает. - person glenn jackman; 28.01.2013
comment
@roguesith: вы можете использовать шаблон в качестве адреса, чтобы указать sed, в каких строках делать замены. ХТН. Спасибо! - person Steve; 28.01.2013

Я бы сделал что-то подобное в 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 заржавел, но я уверен, что кто-нибудь свернет это в анлайнер, называемый аргументом.

person vonbrand    schedule 27.01.2013