2017-04-16 10 views
0

背後には、のは私が行うことができますは、どのように私は、文字と前のスペースを取り除くための方法を取り除くパラメータを使用し、それ

r="part1 - part2" 

文字列があるとしましょうか

PART1=${r%%-*} 
PART2=${r##*-} 

各部分を取得します。 PART1も前面の空白を取得し、PART2は背面の空白を取得します。

しかし、これらの2つの可変部分をパスの一部として使用しようとしているため、スペースがあるため問題になります。

まったく同じ方法を使って空白文字をエスケープする方法があるので、その後ろ/後ろの空白も削除されますか?あなたはこれを行うことができ、文字列でのみ言葉を取得したい場合は

IFS=- read first second <<< "$r" 
$ printf '%q\n' "$first" 
part1\ # Note the space here 
$ printf '%q\n' "$second" 
\ part2 

+0

文字列の最後または最初に一致する必要があるため、あなたが書いたものは機能しません。 '$ {r %% - *}'と '$ {r ## * - }'を試してください。 – 123

+0

何らかの理由で*記号があると、スタックオーバーフローが記号を隠してしまいます。 –

+0

[編集ヘルプ](http://stackoverflow.com/editing-help)をご覧ください。 – Cyrus

答えて

0

あなたがにしたい場合は、あなたがこれを行うことができ、セパレータとしてハイフンに基づいて文字列を分割しました:

ファイルパスにスペース(およびそのような高いUnicode文字、改行文字、句読点などのような他の特殊文字)がシェル・プログラミングのために特に厄介な課題であるが、それらは完全にVAであり、前記
$ read first separator second <<< "$r" 
$ printf '%q\n' "$first" 
part1 
$ printf '%q\n' "$separator" 
- 
$ printf '%q\n' "$second" 
part2 

蓋。特別なパスを処理する最初のルールはquoting properlyです。この権利を取得したら、基本的に有効な* nixパスをサポートするための90%の道を譲ります。他の10%は、(man bashを参照してください)あなたはparse argumentsする必要がある場合は、引数とパス間のセパレータとして--を使用して./外のスクリプトとの相対パスを開始し"$(cd "$(dirname "${BASH_SOURCE\[0\]}")" && pwd)" inside scriptslooping over paths using while、および$''引用符を使用して特殊文字をエスケープするような様々なトリックを伴います。私はこれらを勉強し、のテストケースを書くことを推奨します。

+0

私は彼らが単にスペースを削除したいと思う。 – 123

+0

私はシェルスクリプトを持っています。ファイル名を2つの変数に分割する必要があります。しかし、ファイル名にはハイフンとスペースの両方が含まれています。 "第一"など。私の古いメタを使用して、私はそれに続くスペースで「最初の」、単語の前にスペースがある「秒」を得ます。今私は最初の変数として名前を付けたフォルダにファイルを移動し、2番目の変数としてファイルの名前を変更するように、これら2つの変数を使用する必要があります。mv "file" "Part1/Part2"それの中のスペースは、私を捨てます。 "testFile/TestDir.txt"を "testFile/TestDir.txt"に移動できません:そのようなファイルやディレクトリはありません –

+0

'testFile/TestDir.txt'と言う部分にスペースがあります –

関連する問題