
引用符を使用して文字列を抽出する必要があります。私の文字列は次のとおりです。
"abcd efgh" "ijkl mnop" "qrst uvwxyz"
ijkl mnop
sed
orコマンドを使用してgrep
2番目の二重引用符()間の文字列を取得するのに役立ちますか?
つまり、最初の文字列を引用符で囲むと最初の文字列が必要になり、2番目の文字列を言うと2番目の二重引用符を指定し、二重引用符の間に3番目のA文字列を指定する必要があります。
答え1
文字列をどのように入力したいのか分かりません。これはすでに達成しようとしている目標を達成していますが、文字列の入力方法に応じて変更する必要があるかもしれません。
aa() { echo $3 ; } ; aa "abcd efgh" "ijkl mnop" "qrst uvwxyz"
編集する:したがって、変数にある場合(引用符で定義する必要があります):
AA="\"abcd efgh\" \"ijkl mnop\" \"qrst uvwxyz\""
echo $AA
それから:
FIRST=`echo $AA| awk -F \" '{print $2}'`
SECOND=`echo $AA| awk -F \" '{print $4}'`
THIRD=`echo $AA| awk -F \" '{print $6}'`
echo $FIRST : $SECOND : $THIRD
Jasonwryanが上で指摘したように。 sedを使いたいと言っていましたが、これは不必要に複雑になりました。
FIRST=`echo $AA| sed 's/^\"\([^\"]*\)\".*/\1/'`
SECOND=`echo $AA| sed 's/^\"[^\"]*\" \"\([^\"]*\)\".*/\1/'`
THIRD=`echo $AA| sed 's/^\"[^\"]*\" \"[^\"]*\" \"\([^\"]*\)\".*/\1/'`
編集2: 実際、sed、awk、Perlはまったく使用できません。 .. 組み込みの「読み取り」機能を使用して bash を使用します (echo はデバッグに使用されます)。
#!/bin/bash
aa() {
echo '$1'="$1"
IFS=\" read aaa FIRST bbb SECOND ccc THIRD ddd <<< "$1"
echo FIRST=$FIRST : SECOND=$SECOND : THIRD=$THIRD
}
AA="\"abcd efgh\" \"ijkl mnop\" \"qrst uvwxyz\""
echo '$AA'="$AA"
aa "$AA"
答え2
コメントでこう言われました。
上記の文字列は変数です。各部分(最初、2番目、3番目)を抽出して別の変数に保存する必要があります。
だから別れよう。
IFS=\" #set the shell's field separator
set -f #don't try to glob
set -- $var #split on $IFS
var1=$2 var2=$4 var3=$6 #yay
unset IFS #restore something like a sane default
ただし、これはバックスラッシュでエスケープされた引用符を含めることができる文字列を処理しません。私はそれが好きではないので、これは問題ではないことを願っています。
答え3
ludvik02の答えに基づいて(少し単純化)sed
:
AA='"abcd efgh" "ijkl mnop" "qrst uvwxyz"'
AA1=$(echo "$AA" | sed -r 's/^([^"]*"){1}([^"]*).*/\2/')
AA2=$(echo "$AA" | sed -r 's/^([^"]*"){3}([^"]*).*/\2/')
AA3=$(echo "$AA" | sed -r 's/^([^"]*"){5}([^"]*).*/\2/')
(Note that this ↑ is different on every line.)
-r
正規表現を拡張するオプションを有効にしますsed
。私たちはそれを使うべきです。つまり、{n}
n
以前の正規表現の発生回数です。は、を除くすべての文字と一致し、で終わる複合([^"]*")
(グループ)正規表現です。例入力文字列は、この正規表現と最大6回一致することができます(6文字があるため)。文字列の間隔を区別するために s を挿入します。"
"
"
...
"abcd efgh" ... "ijkl mnop" ... "qrst uvwxyz"
↑↑--------↑↑----↑↑--------↑↑----↑↑----------↑
1 2 3 4 5 6
奇数(たとえば3つ)の項目を一致させると、最初の(n
たとえば3番目の)"
文字、つまり"
文字列の先頭を参照する最初の(たとえば2番目の)文字を含むすべての項目が消費されます。次に、最初の文字(つまり、2番目の引用文字列の末尾にある文字)までのすべての項目を一致(およびグループ化)します。したがって、このグループ(2番目のグループ)は2番目に引用された文字列と一致します。最後に、入力文字列の残りの部分が使用されます。次に、入力行全体を2番目のセットの値に置き換えます。((n+1)/2)
([^"]*)
(n+1)
"
"
.*
\2
"abcd efgh" ... "ijkl mnop" ... "qrst uvwxyz"
↑↑--------↑↑----↑⇑=======⇑⇈≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡⇈
1 2 3
↑---------------↑⇑=======⇑⇈≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡⇈
\1 \2 (unnamed)