13

ディレクトリを指定できるシェルコマンドを作成しようとしています。すると、内部のすべてのファイルとディレクトリで、すべての単語の最初の文字が大文字になります。そう

/doCumenTS/tesT.txt

に変更する必要があります

/DoCumenTS/TesT.txt

次のように始めるべきだと思います

for i in directory do
tr something_goes_here
done

私が理解できない問題は、最初の文字だけを行う方法です。ファイル名全体を大文字にするスクリプトを作成しましたが、すべての単語の最初の文字だけを取得する方法がわかりません。

ありがとう!

4

6 に答える 6

7

GNU Sed の使用

GNU sed を使用すると、これを非常に簡単に行うことができます。例えば:

$ echo '/doCumenTS/tesT.txt' | sed 's!/.!\U&!g'
/DoCumenTS/TesT.txt

制限事項

\U エスケープは GNU sed 拡張であることに注意してください。マニュアルには次のように書かれています。

最後に、GNU 'sed' 拡張として、バックスラッシュと文字 'L'、'l'、'U'、'u'、または 'E' のいずれかで構成される特別なシーケンスを含めることができます。

`\U'
     Turn the replacement to uppercase until a `\L' or `\E' is found
于 2012-07-06T23:36:10.007 に答える
7

Bash 4.0+ には、「小文字から大文字」へのパラメーター置換があります。最初の文字のみを変更するには、次のように使用します。

list=( 'aaa/bbb' 'aAAA' 'aaa/bbb/ccc' 'aaa bbb/ccc' )

IFS='/'
for item in "${list[@]}"; do
  split=( $item )
  echo "'${split[*]^}'"
done

結果:

'Aaa/Bbb'
'AAAA'
'Aaa/Bbb/Ccc'
'Aaa bbb/Ccc'
于 2012-07-07T07:57:31.420 に答える
6
Source="ONE TWO THREE FOUR"
Target="One Two Three Four"

解決策は次のとおりです。

Target=`echo $Source | tr [A-Z] [a-z] | sed -e 's/^./\U&/g; s/ ./\U&/g'`
echo $Target

One Two Three Four

ここから取得: http://souravgulati.webs.com/apps/forums/topics/show/8584862-shell-script-capitalize-first-letter-of-every-word-of-a-line-

于 2013-03-29T12:17:53.507 に答える
3

前:

$ find . -mindepth 1 -depth -print
./file1
./bar/file3
./bar
./foo/file2
./foo/baz/file4
./foo/baz
./foo

変形:

find . -mindepth 1 -depth -print0 | 
while IFS= read -r -d '' filename; do 
    b=$(basename "$filename")
    mv "$filename" "$(dirname "$filename")/${b^}"
done

後:

$ find . -mindepth 1 -depth -print
./Foo/Baz/File4
./Foo/Baz
./Foo/File2
./Foo
./Bar/File3
./Bar
./File1
于 2014-06-06T17:45:25.007 に答える
2

v4の機能を使用してループを回避します。

input='/doCumenTS/tesT.txt'
IFS='/'
dirs=( $input )           # split on '/'
output=( "${dirs[*]^}" )  # capitalize
IFS=$' \t\n'              # reset IFS

シェル関数内に埋め込むことができます:

capitalize_subdirs()
{
  local IFS='/'
  dirs=( $1 )
  echo "${dirs[*]^}"
}

使用法:

output=$( capitalize_subdirs '/doCumenTS/tesT.txt' )

これは、スペース、タブ、および改行を含むパス名でも機能します!

$ capitalize_subdirs '/doCumenTS/tesT.txt'
/DoCumenTS/TesT.txt

$ capitalize_subdirs $'/d\noCu\tme nTS/tesT.txt'
/D
oCu     me nTS/TesT.txt
于 2014-06-06T08:07:13.473 に答える