String

是否有“| cut -f1,2,3 -d:”的參數替換/擴展替代方案,也就是在出現第 n 個字元之後並包括修剪?

  • January 15, 2018

(在 initramfs 內部)的一個古老版本ipconfig要求其使用者輸入最多只能提供 7 個冒號分隔的元素,例如:

ip=client-ip:server-ip:gw-ip:netmask:hostname:device:autoconf

ipconfig當使用者確實提供超過 7 個元素時會導致錯誤。

因此額外的(2個DNS解析器)應該被砍掉。

這可以在subshellwith中完成cut,例如:

validated_input=$(echo ${user_input} | cut -f1,2,3,4,5,6,7 -d:)

如何使用參數擴展/替換cut來編寫這樣的內容?(b)ash

沒有:

  • 啟動子外殼/子程序(管道)
  • IFS-wrangling/mangling

由於 (1) 速度,請參閱使用 bash 變數替換而不是 cut/awk和 (2) 學習。


換句話說:如何查找第 n 個(第 7 個)字元的出現並從那裡刪除/修剪所有內容,直到字元串結尾?

這僅使用參數擴展:

${var%:"${var#*:*:*:*:*:*:*:}"}

範例

$ var=client-ip:server-ip:gw-ip:netmask:hostname:device:autoconf:morefields:another:youwantanother:haveanother:
$ echo "${var%:"${var#*:*:*:*:*:*:*:}"}"
client-ip:server-ip:gw-ip:netmask:hostname:device:autoconf

感謝 ilkkachu 提出了對尾隨的修復:


${parameter#word}
${parameter##word}

單詞被擴展以產生一個模式,就像在文件名擴展中一樣(請參閱文件名擴展)。如果模式匹配參數擴展值的開頭,則擴展結果是具有最短匹配模式(’#’ 情況)或最長匹配模式(’##’ 情況)的參數擴展值刪除。如果參數是’@‘或’ ’,模式移除操作將依次應用於每個位置參數,擴展是結果列表。如果 parameter 是下標為 ‘@’ 或 ’ ’ 的數組變數,則模式移除操作依次應用於數組的每個成員,展開是結果列表。

這將嘗試匹配參數的開頭,如果匹配,它將刪除它。

範例

$ var=a:b:c:d:e:f:g:h:i
$ echo "${var#a}"
:b:c:d:e:f:g:h:i
$ echo "${var#a:b:}"
c:d:e:f:g:h:i
$ echo "${var#*:*:}"
c:d:e:f:g:h:i
$ echo "${var##*:}"    # Two hashes make it greedy
i

${parameter%word}
${parameter%%word}

單詞被擴展以產生一個模式,就像在文件名擴展中一樣。如果模式匹配參數擴展值的尾隨部分,則擴展結果是具有最短匹配模式(’%’ 情況)或最長匹配模式(’%%’ 情況)的參數值刪除。如果參數是’@‘或’ ’,模式移除操作將依次應用於每個位置參數,擴展是結果列表。如果 parameter 是下標為 ‘@’ 或 ’ ’ 的數組變數,則模式移除操作依次應用於數組的每個成員,展開是結果列表。

這將嘗試匹配參數的結尾,如果匹配,它將刪除它。

範例

$ var=a:b:c:d:e:f:g:h:i
$ echo "${var%i}"
a:b:c:d:e:f:g:h:
$ echo "${var%:h:i}"
a:b:c:d:e:f:g
$ echo "${var%:*:*}"
a:b:c:d:e:f:g
$ echo "${var%%:*}"    # Two %s make it greedy
a

所以在答案中:

${var%:"${var#*:*:*:*:*:*:*:}"}

(注意周圍的引號,${var#...}以便將其視為要從 末尾剝離的文字字元串(而不是模式$var)。

應用於:

var=client-ip:server-ip:gw-ip:netmask:hostname:device:autoconf:morefields:another:youwantanother:haveanother:

${var#*:*:*:*:*:*:*:}=morefields:another:youwantanother:haveanother:

內部擴展${var%: ... }如下:

${var%:morefields:another:youwantanother:haveanother:}

所以你說給我:

client-ip:server-ip:gw-ip:netmask:hostname:device:autoconf:morefields:another:youwantanother:haveanother:

:morefields:another:youwantanother:haveanother:剪掉末端。

Bash 參考手冊 ( 3.5.3 )

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