2016-11-08 4 views
1

を返すこんにちは、私は次を含むファイルがあります:sedのマッチ数は、文字列が続き、数

7 Y-N2 
    8 Y-H 
    9 Y-O2 

私は、次のsedコマンドでそれを一致し、行頭の番号を取得したい:

abc=$(sed -n -E "s/([0-9]*)(^[a-zA-Z])($j)/\1/g" file) 

$jは可変であり、正確Y-O2またはY-Hが含まれています。

数値は線数ではありません。

数字の後には常にレターが続きます。

数字の前は空白です。

エコー$abcはホワイトラインを返します。

おかげでここ

+1

で出力されますか? awkを使うと簡単に 'awk -vk =" $ var "'$ 2 == k {print $ 1}' file'を実行できます。 – user000001

+0

期待される出力はabcに保存された番号です。 – Tuni

+0

@ user000001印刷前に "-vk"と "k"を説明できますか? – Tuni

答えて

2

SEDが、このタスクのために過度に複雑に見えますが、awkをして、あなたは書くことができます:-vk="$var"

awk -vk="$var" '$2==k{print $1}' file 

たちは$varシェル変数の値にawk変数kを設定します。

次に、'filter{command}'構文を使用します。この場合、フィルタ$2==kは、2番目のフィールドが変数kと等しいとします。一致した場合は、最初のフィールドを{print $1}で表示します。

2

多くの問題:

  • スペースがある、あなたは^が負の手紙
  • を作るために 内部のchar型のクラスでなければなりません
  • それらを考慮していません。
  • あなたは-nオプションを使用しているので、pコマンドを使用する必要があります。何も印刷されません(gオプションはuselesです)。

    sed -nr "s/ *([0-9]+) +([^a-zA-Z])($j)/\1/p" file 
    

    注:awkは仕事のためのより適していると思われる)は、コマンドを(それは私のsedバージョンによってサポートされていないだったので、私は-n-Eを変更した、両方が動作するはずです)作業

ここよ。例:

awk -v j=$j '$2 == j { print $1 }' file 
1

は、これを試してください

abc=$(sed -n "s/^ *\([0-9]*\) *Y-[OH]2*.*/\1/p" file) 

説明:

  • ^ *次数が後方参照
  • *を使用して捕獲される:スペース
  • \([0-9]*\)任意の数で始まる行での任意の数のスペースの後に
  • Y-[OH]2*:オプション2
  • \1/pNまたはH続いY-文字列を検索:撮影した文字列\1pコマンドこのためにsedを使用する理由
関連する問題