web-dev-qa-db-ja.com

コマンドラインを使用して、引用符が2回出現した後にすべてを削除するにはどうすればよいですか?

変数にこのストアがあります

 sCellEventTrap-03-28 TRAP-TYPE-CAC Code:00 
 ENTERPRISE compaq 
 VARIABLES {scellNameDateTime、
 scellSWComponent、
 scellECode、[ .____。 "
-#TYPE" StorageCell Event "
-#SUMMARY" SCellName-TimeDate%s:SWCID%d:ECode:%d:CAC%d:EIP%d。 "
-#ARGUMENTS {0,1,2,3,4、} 
-#SEVERITY INFORMATIONAL 
-#TIMEINDEX 136 
-#STATE WARNING 
 :: = 13600808 

私は"の2番目の出現まですべてをカットします。だからそれは私に与えます:

 sCellEventTrap-03-28 TRAP-TYPE-CAC Code:00 
 ENTERPRISE compaq 
 VARIABLES {scellNameDateTime、
 scellSWComponent、
 scellECode、[ .____。 「
 

もう一つの例

 genericSanEvent TRAP-TYPE 
 ENTERPRISE hpSanManager 
 VARIABLES {severityLevel、category、id、
 msgString、contactName、contactEmail、
 contactWorkPhone、contactHomePhone、
 contactPager、contactFax} 
 DESCRIPTION 
 "汎用SANイベントが発生しました。変数は次のとおりです。
 severityLevel-イベントの重大度レベル; 
 category-報告されているイベントのカテゴリ; 
 code-指定されたカテゴリのイベントのID; 
 msgString-イベントを説明する
メッセージ文字列; 
 contactName-イベントの通知を受ける個人の名前
; 
 contactEmail -contactNameで参照される
個人の電子メールアドレス; 
 contactWorkPhone-
 contactNameで参照される個人の勤務先電話番号
。 ____。] contactHomePhone-
 contactNameで参照される個人の自宅電話番号
; 
 contactPager-contactNameで参照される
個人のポケットベル番号。 
 contactFax-個人のFAX番号
 contactNameで参照されます "
-以下は、xnmloadmibがフォーマットを改善するために使用する属性です
-#TYPE OV SAM SANイベント "
-#SUMMARY" OV SAM SANイベント、カテゴリ/ I d:%d /%d、メッセージ:%d重大度:%d連絡先:%d "
-#ARGUMENTS {1,2,3,0,4} 
-#SEVERITY CRITICAL 
-#GENERIC 6 
-#CATEGORY "アプリケーションアラートイベント" 
-#SOURCE_ID "T" 
 :: = 1 

この例の出力は次のようになります。

 genericSanEvent TRAP-TYPE 
 ENTERPRISE hpSanManager 
 VARIABLES {severityLevel、category、id、
 msgString、contactName、contactEmail、
 contactWorkPhone、contactHomePhone、
 contactPager、contactFax} 
 DESCRIPTION 
 "汎用SANイベントが発生しました。変数は次のとおりです。
 severityLevel-イベントの重大度レベル; 
 category-報告されているイベントのカテゴリ; 
 code-指定されたカテゴリのイベントのID; 
 msgString-イベントを説明する
メッセージ文字列; 
 contactName-イベントの通知を受ける個人の名前
; 
 contactEmail -contactNameで参照される
個人の電子メールアドレス; 
 contactWorkPhone-
 contactNameで参照される個人の勤務先電話番号
。 ____。] contactHomePhone-
 contactNameで参照される個人の自宅電話番号
; 
 contactPager-contactNameで参照される
個人のポケットベル番号。 
 contactFax-contactNameで参照される個人のFAX番号
 "
 
7
SamFlynn

Awkの使用:

awk -v RS='"' -v ORS='"' 'NR==1{print} NR==2{print; printf"\n";exit}' file

これにより、レコード区切り文字が"に設定されます。したがって、最初の2つのレコードを印刷して、完了です。さらに詳細に:

  • -v RS='"'

    これにより、入力レコードの区切り文字が二重引用符に設定されます。

  • -v ORS='"'

    これにより、出力レコード分離文字が二重引用符に設定されます。

  • NR==1{print}

    これは、awkに最初の行を印刷するよう指示します。

  • NR==2{print; printf"\n";exit}

    これは、awkに2行目を印刷し、改行文字を印刷してから終了するように指示します。

Sedを使用する

sed -r 'H;1h;$!d;x; s/(([^"]*"){2}).*/\1/' file

これにより、ファイル全体が一度に読み込まれます。そのため、ファイルが大きい場合は、このアプローチを使用しないでください。次のように機能します。

  • H;1h;$!d;x

    これは便利なsedイディオムです。ファイル全体を一度に読み込みます。

  • s/(([^"]*"){2}).*/\1/

    これは2番目の"を探し、2番目の引用符に続くすべてのテキストを削除します。

    正規表現(([^"]*"){2})は、2番目の二重引用符までのすべてのテキストをキャプチャし、グループ1に保存します。正規表現.*は、ファイルの最後まで続くすべてをキャプチャします。置換テキストはグループ1、\1です。

9
John1024

以下に、小さなpythonスクリプトを示します。

#!/usr/bin/env python2
with open('/path/to/file.txt') as f:
    print '"'.join(f.read().split('"')[:2]) + '"'
  • f.read().split('"')はファイル全体を文字列として読み取り、"で分割してすべての"で区切られた部分を取得します

  • 最初の2つの"で区切られた部分のみに関心があるため、'"'.join(f.read().split('"')[:2])は最初の2つを"で結合します

  • 次に、"を追加して、目的の形式を取得しました。

3
heemayl

多くのプログラムは入力として非常に長い行を好まないが、データが大きくない場合は、多くの場合単純化できます複数行一致最初にデータを操作してすべてを1行に配置し、次に一致を実行してから、改行を復元します。

たとえば、trを使用して改行\nをデータにない文字で置き換え(キャリッジリターン '\ r'を使用)、sedを使用してこの単一行を変更し、次に文字をtrに戻します。

tr '\n' '\r' < file |
sed 's/\("[^"]*"\).*/\1/' |
( tr '\r' '\n';  echo ) # add a final newline

それ以外の場合、sed/awk/grepが必要であると言いますが、Perlやpythonなどの言語はこれらと同様の正規表現を使用し、複数行の文字列を操作するのに適しています。例:Perl:

Perl -e '$_ = join("",<>); s/(".*?").*/$1/s; print "$_\n"; ' file
3
meuh

Perlの使用:

< infile Perl -0777 -pe 's/((.*?"){2}).*/$1/s' > outfile
  • -0777:一度に1行ではなく、ファイル全体を一度に丸lurみします
  • -p:スクリプトの周りにwhile (<>) {[...]}ループを配置し、処理されたファイルを出力します
  • -e:引数からスクリプトを読み取ります

Perlコマンドの内訳:

  • s:置換を実行するようにアサートします
  • /:パターンを開始します
  • ((.*?"){2})"文字の前に、現在のファイル内で任意の数の文字を0回以上遅延して一致(グループ化)します(つまり、次のパターンが一致し始めると停止します) 、二度
  • .*:現在のファイル内の任意の数の任意の文字と0回以上一致します(つまり、可能な限り最も一致します)。
  • /:パターンを停止/置換文字列を開始
  • $1:最初にキャプチャされたグループに置き換えます
  • /:置換文字列を停止する/修飾子を開始する
  • s:ファイル全体を1行として扱い、.が改行にも一致するようにします
3
kos

短いawkバージョン:awk '/TRAP-TYPE/,/[[:alpha:]]*"$/ '

$ awk '/TRAP-TYPE/,/[[:alpha:]]*"$/ ' testfile.txt                             
   sCellEventTrap-03-28 TRAP-TYPE  -- CAC Code: 00
        ENTERPRISE compaq
        VARIABLES  { scellNameDateTime,
                     scellSWComponent,
                     scellECode,
                     scellCAC,
                     scellEIP}
        DESCRIPTION
             "Severity: Normal -- informational in nature. A physical disk drive has experienced an ID block inconsistency during a periodic drive check."


$ awk '/TRAP-TYPE/,/[[:alpha:]]*"$/ ' testfile2.txt                                                 
    genericSanEvent TRAP-TYPE
        ENTERPRISE hpSanManager
        VARIABLES  { severityLevel, category, id,
                     msgString, contactName, contactEmail,
                     contactWorkPhone, contactHomePhone, 
                     contactPager, contactFax }
        DESCRIPTION
                        "A generic SAN event has occurred.  The variables are:
                            severityLevel - the event severity level;
                            category - Category of the event being reported;
                            code - ID of the event in the given category;
                            msgString - the message string describing
                                the event;
                            contactName - the name of the individual
                                to be notified of the event;
                            contactEmail - the e-mail address of the
                                individual referred to in contactName;
                            contactWorkPhone - the work phone number
                                of the individual referred to in 
                                contactName;
                            contactHomePhone - the home phone number
                                of the individual referred to in 
                                contactName;
                            contactPager - the pager number of the 
                                individual referred to in contactName;
                            contactFax - the FAX number of the individual
                                 referred to in contactName"
2