.txt
ファイルを読み取り、結果をどこかに保存するスクリプトを作成しています。
表現を減らす必要があります。
str1/str2/str3/str4/str5
私はただ必要です。str5
上の内容です。
ループから1行ずつファイルを読み込んでいますwhile
。
そのような文字列を減らすには?
答え1
このbasename
ユーティリティは、パス名のファイル名部分を返します。文字列をパス名として処理すると、次のものが返されますstr5
。
string=str1/str2/str3/str4/str5
basename -- "$string"
上記の出力はstr5
。これは$string
、改行文字が含まれている場合、または次から始まる場合にも機能します-
。
string='-str1/str2/str3/str
4/str5'
basename -- "$string"
結果をbasename
変数に保存することは、一般的なコマンド置換によって行われます。
newstring=$( basename -- "$string" )
しかし、コマンドの置き換え巻きみんな末尾の改行文字:行区切り文字として出力される文字ですが、末尾にbasename
ある改行文字も含まれます$string
。
これはPOSIXシェルの演算子を使用して回避することができます${var##pattern}
(また、プロセスをフォークし、別のコマンドを実行することを節約できます)。
string='very/
strange
file name
'
newstring=${string##*/}
ただし、s のよう$string
な他の値を提供します。/
/some/dir/
答え2
これはあなたに効果がありますか?
string="str1/str2/str3/str4/str5"
echo $string | awk -F'/' '{print $5}'
-F は区切り文字を指定するために使用されます。
答え3
whileループからファイルを読み取るときは、次のことができます。
while IFS='/' read -r one two three four five junk; do
echo "$five"
done < yourfile
または、次のものを使用できますcut
。
cut -d'/' -f5 yourfile
答え4
簡単な代替を使用できます。
echo ${string##*/}
例えば
string="str1/str2/str3/str4/str5"
echo ${string##*/}
出力を提供しますstr5
。文字列に改行文字がある場合にも機能します。
/
可変サイズ文字列がある場合にも機能します。つまり、文字列にどれだけの文字列が含まれているのかわかりません。