区切り文字の最初の出現による文字列の分割


54

次の形式の文字列があります

id;some text here with possible ; inside

の最初の出現によって2つの文字列に分割したい;。だから、それは次のようになりますidし、some text here with possible ; inside

文字列を分割する方法は知っていますが(たとえば、cut -d ';' -f1)、;左部分の内側にあるため、より多くの部分に分割されます。


文字列が分割された後、「id」で何をしたいですか?変数に割り当てたり、印刷したりしますか?
デーモンオブカオス

私は2つの変数を持っているつもり:idstring
gakhov

回答:


65

cut これに適したツールのように聞こえます:

bash-4.2$ s='id;some text here with possible ; inside'

bash-4.2$ id="$( cut -d ';' -f 1 <<< "$s" )"; echo "$id"
id

bash-4.2$ string="$( cut -d ';' -f 2- <<< "$s" )"; echo "$string"
some text here with possible ; inside

しかしread、さらに適切です:

bash-4.2$ IFS=';' read -r id string <<< "$s"

bash-4.2$ echo "$id"
id

bash-4.2$ echo "$string"
some text here with possible ; inside

3
すばらしいです!それは魅力のように機能します!をread使用しているので選択しますbash。@manatworkありがとうございます!
ガホフ

このcutアプローチは、「$ s」に改行文字が含まれていない場合にのみ機能します。readは、Bourneのようなシェルにあります。<<<はrc、zsh、およびbashとksh93の最近のバージョンにあり、標準ではありません。
ステファンシャゼラス

おっと、あなたは正しい@StephaneChazelasです。私の心はにあった-a言及何らかの理由bashさんread。(明らかにここでは
役に立た

$ sにも改行文字が含まれている場合、読み取りアプローチが機能しないことを忘れていました。私は自分の答えを追加しました。
ステファンシャゼル

1
私は、中に末尾のダッシュを強調したい-f 2-string="$( cut -d ';' -f 2- <<< "$s" )"; echo "$string"コマンド。これは、印刷用の文字列内の残りの区切り文字を無視するものです。明白ではないのmanページを見ているときcut
スティーン

18

標準のsh(bashを含む)の場合:

sep=';'
case $s in
  (*"$sep"*)
    before=${s%%"$sep"*}
    after=${s#*"$sep"}
    ;;
  (*)
    before=$s
    after=
    ;;
esac

readベースのソリューションは、改行文字が含まれていない$sep場合にのみ、スペース、タブ、または改行以外の単一文字(および一部のシェル、シングルバイト)値に対して$s機能します。

cutベースのソリューションは$s、改行文字が含まれていない場合にのみ機能します。

sedの任意の値を持つすべてのコーナーケースを処理するソリューションを考案することができますが$sep、そのためのシェルに組み込みサポートがある場合、そこまで行く価値はありません。


6

既に述べたように、値をidstringに割り当てたい

最初にパターンを変数に割り当てます(たとえばstr)

    str='id;some text here with possible ; inside'
    id=${str%%;} 
    string=${str#;}

今、あなたはそれぞれの変数にあなたの値を持っています


コマンドから some_commandパターンを取得している場合、
set-

1
この答えは@StephaneChazelasとどう違うのですか?
ベルンハルト

4

他のソリューションに加えて、次のようなものregexを試すことができます。

a="$(sed 's/;.*//' <<< "$s")"
b="$(sed 's/^[^;]*;//' <<< "$s")"

またはあなたが正確に何をしようとしているかに応じて、使用することができます

sed -r 's/^([^;]*);(.*)/\1 ADD THIS TEXT BETWEEN YOUR STRINGS \2/'

ここ\1\2は、必要な2つの部分文字列が含まれています。


1

標準bashのソリューション:

    text='id;some text here with possible ; inside'
    text2=${text#*;}
    text1=${text%"$text2"}

    echo $text1
    #=> id;
    echo $text2
    #=> some text here with possible ; insideDD
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.