是否有“| cut -f1,2,3 -d:”的參數替換/擴展替代方案,也就是在出現第 n 個字元之後並包括修剪?
(在 initramfs 內部)的一個古老版本
ipconfig
要求其使用者輸入最多只能提供 7 個冒號分隔的元素,例如:ip=client-ip:server-ip:gw-ip:netmask:hostname:device:autoconf
ipconfig
當使用者確實提供超過 7 個元素時會導致錯誤。因此額外的(2個DNS解析器)應該被砍掉。
這可以在
subshell
with中完成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 )