web-dev-qa-db-ja.com

sedの特定のパターンで始まる行を抽出します

私の入力ファイルは次のようなものです。

IDno="1"
Name=Jack
Type=Student
IDno="2"
Name=Jill
Type=Teacher

タイプが学生の場合にのみ、sedを使用してすべてのIDnoとタイプを抽出します。

sed -e '/IDno=/b' -e '/Type=Student/b' d

これにより、ID学生ではなく、学生タイプのすべての行が取得されます。

私は手に入れたい

IDno="1"
Type=Student
IDno="2"

しかし、私は得ています

Type=Student

何が間違っていますか?

3
user110327

egrepは、ファイルから複数の行を取得できます。パイプ|をセパレータとして使用すると、必要な数のさまざまな基準をプルできます。 egrepgrep -Eと同等です。 egrepは、/binフォルダーにあるスクリプトであり、その内容はexec grep -E "$@"を指します。

例:

egrep "IDno=|Type=Student" inputfile

または

grep -E "IDno=|Type=Student" inputfile

出力する必要があります:

IDno="1"
Type=Student
IDno="2"

お役に立てれば!

4
Terrance

sedを使用すると、特定の行を印刷するには、-nオプションとpコマンドを使用する方が簡単です。

sed -rn '/IDno=|Type=Student/p'

または:

sed -n -e '/IDno=/p' -e '/Type=Student/p'

-nオプションは、明示的に印刷しない限り出力を抑制します。もちろん、pコマンドは一致する行を出力します。

4
muru
  • awk

    フィールドセパレータを=として設定し、Type=Studentを含むレコードをレコード全体として、またはIDnoを最初のフィールドとして印刷します。

    awk -F= '$1=="IDno" || $0=="Type=Student"'
    
  • Perl

    IDnoで始まり、=が続く行、またはTypeで始まり、=が続き、Studentで終わる行を印刷します。

    Perl -ne 'print if /^(IDno=|Type=Student$)/'
    

例:

% cat file.txt                                  
IDno="1"
Name=Jack
Type=Student
IDno="2"
Name=Jill
Type=Teacher

% awk -F= '$1=="IDno" || $0=="Type=Student"' file.txt
IDno="1"
Type=Student
IDno="2"

% Perl -ne 'print if /^(IDno=|Type=Student$)/' file.txt
IDno="1"
Type=Student
IDno="2"
3
heemayl

元の質問は、すべてのIDnoとタイプを抽出するために」を求めているようですタイプが学生の場合のみ "しかし、例出力はすべてのIDno =行を返すため、かなり矛盾しています...

Type = Studentの場合にIDnoとTypeのみを返す回答を次に示します。

sed -n 'N;N;/IDno=.*Type=Student/p' filename | grep -v "^Name="

少し説明:

  • -n, --quiet, --silentパターンスペースの自動印刷を抑制します
  • N;N;入力の次の行をパターンスペースに読み込み/追加します。 (2回)
  • /IDno=.*Type=Student/p IDno =からType = Studentまで検索して印刷
  • | grep -v "^Name=" Name =行を表示しない

私はsed | grepが好きではありませんが、出力を再検索するためにsedを取得する方法がわからないため、パイプは一般的に「この出力を取得して何かをする」と言います... grep | sedもできます

grep -v "^Name=" t | sed -n 'N;N;/IDno=.*Type=Student/p'
0
Xen2050