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プログラム)を使用したい

ファイル内のすべての単語をキャップする解決策を見つけましたが、それを特定の行に制限する方法や、空白の代わりにダッシュで接続された単語を含める方法がわかりません

4

2 に答える 2

2

を使用しGNU sedて、アドレス(ターゲット行番号を示す)を使用して、目的の行に置換を適用するように指示します。たとえば、最初の行に置換を適用するには、次のようにします。

sed -r '1s/(\w)(\w*)/\U\1\L\2/g' file

3行目に置換を適用するには:

sed -r '3s/(\w)(\w*)/\U\1\L\2/g' file

1行目と3行目の両方に置換を適用するには:

sed -r -e '1s/(\w)(\w*)/\U\1\L\2/g' -e '3s/(\w)(\w*)/\U\1\L\2/g'

2行目が変更されてもかまわない場合は、アドレス範囲を使用できます。

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 に答える