文字列に表示される最後の特定の文字を使用して、文字列を半分に切り捨てます。

文字列に表示される最後の特定の文字を使用して、文字列を半分に切り捨てます。

たとえば、文字列の場合、文字を使用して文字列を半分に分割すると、結果はとa_link_list_javaです。 _a_link_listjava

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' 

関連情報