2013-01-27 2 views
2

Я уценки файлы отформатированный как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, которая вводит и выводит каналы)

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

ответ

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' 

Если вы не возражаете против изменения второй строки, вы можете использовать диапазон адресов:

EDIT:

Согласно комментариям ниже:

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 
+0

Поскольку это огромные файлы (книги), я не знаю, на каких строках они будут находиться. Все, что у меня есть, это «^ глава», чтобы перейти на – roguesith

+1

@roguesith, Стив дал вам правильный ответ. Пожалуйста, вознаградите его, приняв его ответ. Кроме того, этот код использует расширения GNU, поэтому дайте нам знать, если он не работает для вас. –

+1

Отлично! Спасибо – roguesith

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, названный в качестве аргумента.

Смежные вопросы