たとえば、文字列の場合、文字を使用して文字列を半分に分割すると、結果はとa_link_list_java
です。 _
a_link_list
java
list_java
結果は次のとおりlist
ですjava
。
これら2つの部分を2つの変数に保存したいと思います。
コマンドを試しましたが、cut
文字列に表示されている1文字だけが機能します。
Bashシェルスクリプトでこれを行うにはどうすればよいですか?
答え1
シェルパラメータ拡張次のことができます。
$ v="a_link_list_java"
$ printf "%s\n" "${v%_*}" "${v##*_}"
a_link_list
java
ただし、拡張子のパターンが一致しないと何も削除されませんのでご注意ください。したがって、両方の変換は下線付きの値を変更しません。
$ v=foo
$ printf "%s\n" "${v%_*}" "${v##*_}"
foo
foo
答え2
そしてsed
:
var1=$(sed 's/_[^_]*$//' file)
var2=$(sed 's/.*_//' file)
これはsed
非常に貪欲なので、2番目のケースでは、globは*
前の下線を含むすべての文字を消費します_
。
出力:
$ echo "$var1"
a_link_list
$ echo "$var2"
java
答え3
を使用すると、awk
すべてを個別に区切り記号として定義できます。_
VAR1=$(awk -F'_' '{print $1}' infile.txt)
$1
最初のフィールドを指す代わりに、上記のインデックスに基づいて目的のフィールドを印刷できます。
bash
または配列として使用して読み取ることができます。
IFS='_' read -r -a array <<< "$myString"
その後、個々のインデックス番号を読みます。
echo "${array[2]}"
あるいは、単にbashパラメータ拡張を使用することもできます。
VAR1="${myString%_*}" # will gives you 'a_link_list'
VAR2="${myString##*_}" # will gives you 'java'
VAR3="${VAR1%_*}" # will gives you 'a_link'