2

私はファイルを持っています:

@Book{gjn2011ske, 
  author =   {Grzegorz J. Nalepa},
  title =    {Semantic Knowledge Engineering. A Rule-Based Approach},
  publisher =    {Wydawnictwa AGH},
  year =     2011,
  address =  {Krak\'ow}
}

@article{gjn2010jucs,
  Author =   {Grzegorz J. Nalepa},
  Journal =  {Journal of Universal Computer Science},
  Number =   7,
  Pages =    {1006-1023},
  Title =    {Collective Knowledge Engineering with Semantic Wikis},
  Volume =   16,
  Year =     2010
}

1行目だけ削除した正規表現を改善したい。注:レコード セパレータRS="}\n"は変更できません。

私は試した:

awk 'BEGIN{ RS="}\n" } {gsub(/@.*,/,"") ; print }' file

結果を印刷したい:

  author =   {Grzegorz J. Nalepa},
  title =    {Semantic Knowledge Engineering. A Rule-Based Approach},
  publisher =    {Wydawnictwa AGH},
  year =     2011,
  address =  {Krak\'ow}

  Author =   {Grzegorz J. Nalepa},
  Journal =  {Journal of Universal Computer Science},
  Number =   7,
  Pages =    {1006-1023},
  Title =    {Collective Knowledge Engineering with Semantic Wikis},
  Volume =   16,
  Year =     2010

ご協力ありがとうございました。

編集:

私の提案した解決策:

awk 'BEGIN{ RS="}\n" }{sub(",","@"); sub(/@.*@/,""); print }' file 
4

4 に答える 4

2

私はGNU sedこれを行うために使用します:

sed '/^@/,/^}$/ { //d }' file.txt

結果:

  author =   {Grzegorz J. Nalepa},
  title =    {Semantic Knowledge Engineering. A Rule-Based Approach},
  publisher =    {Wydawnictwa AGH},
  year =     2011,
  address =  {Krak\'ow}

  Author =   {Grzegorz J. Nalepa},
  Journal =  {Journal of Universal Computer Science},
  Number =   7,
  Pages =    {1006-1023},
  Title =    {Collective Knowledge Engineering with Semantic Wikis},
  Volume =   16,
  Year =     2010

フラグを使用してその-i場で変更を行う (つまり、ファイルの内容を上書きする) ことも、-sフラグを使用して複数のファイルを変更することもできることに注意してください。例えば:

sed -s -i '/^@/,/^}$/ { //d }' *.txt
于 2012-09-30T12:32:08.723 に答える
2

正規表現を使わない一方向。フィールド区切り文字を改行に設定すると、レジスタの各キーがフィールドになります。これで、各フィールドをトラバースし、で始まらないものを出力します@:

awk '
    BEGIN { 
        RS="}\n"; 
        FS=OFS="\n"; 
    } 
    { 
        for (i=1; i<=NF; i++) { 
            if ( substr($i, 1, 1) != "@" ) { 
                printf "%s%s", $i, (i == NF) ? RS : OFS; 
            } 
        } 
    }
' file

出力:

author =   {Grzegorz J. Nalepa},
title =    {Semantic Knowledge Engineering. A Rule-Based Approach},
publisher =    {Wydawnictwa AGH},
year =     2011,
address =  {Krak\'ow}

Author =   {Grzegorz J. Nalepa},
Journal =  {Journal of Universal Computer Science},
Number =   7,
Pages =    {1006-1023},
Title =    {Collective Knowledge Engineering with Semantic Wikis},
Volume =   16,
Year =     2010
于 2012-09-30T11:58:28.733 に答える
2

RS指定された設定で目的を達成するのは困難です( にaddress = {Krak\'ow}は余分なレコードの末尾があるため)。私はむしろ一緒に行きたい:

awk '$0 !~ "^@" && $0 !~ "^} *$" { print }' FILE 

実際の動作はこちらでご覧ください。

EDITなぜ正規表現ソリューションを使用する必要があるのか​​ わかりません。説明していただけますか?

とにかく、正規表現を使用するさらに別の(動作中、こちらを参照)ソリューションですが、期待しているものではありません。

awk 'BEGIN{ RS="}\n" }
{
  split($0,a,"\n")
  for (e=1;e<=length(a);e++) {
      if (a[e] ~ "{" && a[e] !~ "}") {
          sub("$","}",a[e])
      }
      if (a[e] ~ "=") { print a[e] }
  }
  printf("\n")
}' INPUTFILE

もう1つ、はるかに単純な正規表現を使用しますがaddress、最後の " " 行}が で削除されて失敗し、RS最後の}...が出力されます。

awk 'BEGIN{ RS="}\n" }
{
  sub("@[^,]\+,","")
  print $0
}' INPUTFILE
于 2012-09-30T11:09:53.453 に答える
1
awk '{if($0!~/@/&&$0!~/^}/)print}' temp

以下でテスト済み:

> awk '{if($0!~/@/&&$0!~/^}/)print}' temp
  author =       {Grzegorz J. Nalepa},
  title =        {Semantic Knowledge Engineering. A Rule-Based Approach},
  publisher =    {Wydawnictwa AGH},
  year =         2011,
  address =      {Krak\'ow}

  Author =       {Grzegorz J. Nalepa},
  Journal =      {Journal of Universal Computer Science},
  Number =       7,
  Pages =        {1006-1023},
  Title =        {Collective Knowledge Engineering with Semantic Wikis},
  Volume =       16,
  Year =         2010
>
于 2012-10-01T06:46:10.150 に答える