改行を安全に処理している間にファイル名を安全に処理するためのスクリプトを作成しようとしていたのですが、難しいテストケースがありました。区切られた複数行の文字列の接尾辞を削除する
入力この入力は、単一のファイル名を表し
a.b.c
.d.staging
を考えると、私は.staging
サフィックスを取り除きたいです。私は通常、このために| rev | cut -d. -f2- | rev
に似何かを使用しますが、これは失敗します。
echo -ne "a.b.c\\n.d.staging" | rev | cut -d. -f2- | rev
利回り
a.b
.d
staging
接尾辞に加えてc
部品を失ったことに加えて、唯一の改行もあります最後にMarkdownが隠れています。
私がこれまでに作ってみた最適なソリューションが動作するように表示される、sed -e ':a' -e 'N' -e '$!ba' -e 's/\(.*\)\..*/\1/'
を使用することです:正しい出力である
echo -ne "a.b.c\\n.d.staging" | sed -e ':a' -e 'N' -e '$!ba' -e 's/\(.*\)\..*/\1/'
利回り
a.b.c
.d
を。
sed
はお粗末ではないので、これはニューラインの処理にsed
を叩いているので、これは洗練されていないようです。
もっと洗練されたソリューションはありますか? POSIX互換のものが理想的です。
あなたは[パラメータ展開]について学ぶ必要があります(http ://pubs.opengroup.org/onlinepubs/009604499/utilities/xcu_chap02.html#tag_02_06_02)(Bashの[パラメータの拡張]にはもっと甘いものがあります(https://www.gnu.org/software/bash/manual/bashref .html#シェルパラメータ拡張))。 chepnerとanubhavaの例を見て、リファレンスから学んでください! –
パラメータの拡張がPOSIX互換であったかどうかはわかりませんでした。 [Per chepner](http://stackoverflow.com/questions/39730821/remove-suffix-of-a-delimited-multiline-string#comment66759522_39730879)、そうです。 –