Bash

提取多行字元串的最後一行

  • December 28, 2015

的輸出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##*"
"}"

……但它看起來有點滑稽,也許。

引用自:https://unix.stackexchange.com/questions/251546