2016-09-27 5 views
1

改行を安全に処理している間にファイル名を安全に処理するためのスクリプトを作成しようとしていたのですが、難しいテストケースがありました。区切られた複数行の文字列の接尾辞を削除する

入力この入力は、単一のファイル名を表し

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互換のものが理想的です。

+0

あなたは[パラメータ展開]について学ぶ必要があります(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の例を見て、リファレンスから学んでください! –

+0

パラメータの拡張がPOSIX互換であったかどうかはわかりませんでした。 [Per chepner](http://stackoverflow.com/questions/39730821/remove-suffix-of-a-delimited-multiline-string#comment66759522_39730879)、そうです。 –

答えて

4

変数に名前がある場合、改行は問題になりません。

あなたが行うことができますBASH使用
$ fname=$'a.b.c\n.d.staging' 
$ echo "$fname" 
a.b.c 
.d.staging 
$ echo "${fname%.*}" 
a.b.c 
.d 
$ 
+0

私は 'bash(1)'で '$ {string%word}'を見ましたが、それがバーシズムかPOSIXモードでサポートされているかはわかりませんでした。それは移植可能な構造ですか? –

+1

[移植可能です](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02) – chepner

2

:あなたはヌルRSを使用して、このようawkを使用することができますBASHのサポートがなければ

$> s=$'a.b.c\n.d.staging' 

$> echo "$s" 
a.b.c 
.d.staging 

$> echo "${s%.staging}" 
a.b.c 
.d 

を:

printf "%b" 'a.b.c\n.d.staging' | awk -v RS= '{sub(/\.[^.]+$/, "")} 1' 

a.b.c 
.d 
+1

パラメータ拡張 '$ {var%stuff} 'は有効なPOSIXです。外部ツールを使用する必要はありません! –

+0

ああ、 'print'は' echo -ne "a.b.c \\ n.d.staging"の代わりになっているだけです。 – anubhava

+0

私のテストから出力に追加された擬似改行を避けるには '-v ORS ='が必要です。 –

関連する問題