cut -f1,2,3 -d:" の代替引数 代替/拡張代替はありますか?

cut -f1,2,3 -d:

一つ古代initramfs 内のバージョンでは、ipconfigユーザー入力がコロンで区切られた要素を最大 7 個だけ提供する必要があります。たとえば、次のようになります。

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

ipconfigユーザーが7つ以上の要素を提供すると、エラーが発生します。

したがって、追加(2つのDNSリゾルバ)をカットする必要があります。

subshellたとえば、次のように内部でこれを実行できますcut

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

パラメータ拡張/代替を使用してcutこのようなコードをどのように記述できますか?(b)ash

いいえ:

  • サブシェル/サブプロセスの開始(パイプライン)
  • IFS - 引数/破壊

(1) 速度以降参照Cut/awk の代わりに bash 変数置換を使用する(2) 学習。


つまり、n(7番目)の文字が見つかり、そこから文字列の終わりまですべてを削除/切り捨てるにはどうすればよいですか?

ベストアンサー1

これはパラメータ拡張のみを使用します。

${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}

ファイル名拡張と同様に、単語が拡張されてパターンが生成されます(ファイル名拡張子を参照)。パターンがパラメータ拡張値の先頭に一致する場合、拡張結果は、最短一致パターン(「#」の場合)または最長一致パターン(「##」の場合)を持つパラメータ拡張値になります。削除されました。パラメータが「@」または「の場合'を使用すると、各位置引数にパターン除去操作が順番に適用され、拡張が結果リストになります。パラメータが配列変数の場合、下付き文字は「@」または「'を実行すると、配列の各メンバーにパターン削除操作が順番に適用され、拡張が結果リストになります。

これはマッチを試みますスタートパラメータがあると削除されます。

はい:

$ 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}

ファイル名拡張と同様に、単語を拡張してパターンを生成します。パターンがパラメータ拡張値の末尾の部分と一致する場合、拡張結果は、最短一致パターン(「%」ケース)または最長一致パターン(「%%」ケース)を持つパラメータ値を削除します。パラメータが「@」または「の場合'を使用すると、各位置引数にパターン除去操作が順番に適用され、拡張が結果リストになります。パラメータが配列変数の場合、下付き文字は「@」または「'を実行すると、配列の各メンバーにパターン削除操作が順番に適用され、拡張が結果リストになります。

これはマッチを試みます終わりパラメータがあると削除されます。

はい:

$ 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)

おすすめ記事