Bash
提取多行字元串的最後一行
的輸出
exif
如下所示:ExifMnoteCanon: Loading entry 0xcf27 ('(null)')... ExifMnoteCanon: Loading entry 0x3ca8 ('(null)')... ExifMnoteCanon: Loading entry 0xf88a ('(null)')... 2013:08:22 18:01:16
在我的 bash 腳本中,我將其儲存在一個變數中:
datetime="$(exif --debug --machine-readable --tag=DateTimeOriginal "$file" 2>&1)"
我想使用 bash 參數替換來提取最後一行。我認為這會起作用:
datetime="${datetime##*\n}"
但是輸出是:
ull)')... 2013:08:22 18:01:16
為什麼這不起作用,我該如何解決?
使用 ANSI C 風格的轉義序列,
$'\n'
來表示換行符:% echo "$datetime" ExifMnoteCanon: Loading entry 0xcf27 ('(null)')... ExifMnoteCanon: Loading entry 0x3ca8 ('(null)')... ExifMnoteCanon: Loading entry 0xf88a ('(null)')... 2013:08:22 18:01:16 % echo "${datetime##*\n}" ull)')... 2013:08:22 18:01:16 % echo "${datetime##*$'\n'}" 2013:08:22 18:01:16
如您所見,否則
\n
被視為文字n
。
雖然
$''
現在非常便攜(例如,**BSD支持 if,儘管它的下游分支不支持)sh``dash
,但 POSIXLY:eval 'printf "%s\n" "${datetime##*"'"$(printf '\n"')}\""
…會工作,即使它很煩人。不過,我通常會在變數中保留換行符
$nl
,因此:printf "%s\n" "${datetime##*$nl}"
…更易於管理。當然你可以這樣做:
printf "%s\n" "${datetime##*" "}"
……但它看起來有點滑稽,也許。