Печать между двумя узорами - PullRequest
0 голосов
/ 02 ноября 2019

Как печатать с помощью awk между двумя рисунками таким образом, чтобы эти два рисунка находились на одной и последней строке только без других символов?

awk '
/\\caption/{
  next
}
/\\begin|word1/{
  found=1
}
found;
/\\end|word2/{
  found=""
}
' file.txt

file.txt:

text
\begin
gdgs
\end}
text
word1
gdflgk
gfdsg
word2
fg

Требуемый вывод:

\begin
gdgs
\end
word1
gdflgk
gfdsg
word2

Вывод сейчас:

\begin
gdgs
\end}
word1
gdflgk
gfdsg
word2

Ответы [ 3 ]

1 голос
/ 02 ноября 2019

Это должно сделать:

cat file
text
test\begin data
yes
gdgs
here we go
some\end}test
text

awk 'BEGIN {s="\\begin";e="\\end"} $0~"\\"e {split($0,a,"\\"e);print a[1]e;exit} f; $0~"\\"s {split($0,a,"\\"s);print s a[2];f=1}' file
\begin data
yes
gdgs
here we go
some\end

Часть хитрости здесь - это \, которую нужно избежать во всех местах. Если бы это были просто нормальные символы, если бы они были проще.
Хитрость здесь в том, что я разбил строку на тэг start или stop и беру только то, что мне нужно после запуска или до остановки.

Проще читать:

awk '
  BEGIN {
    s="\\begin";
    e="\\end"}

  $0~"\\"e {
    split($0,a,"\\"e);
    print a[1]e;
    exit}

  f; 

  $0~"\\"s {
    split($0,a,"\\"s);
    print s a[2];
    f=1}
  ' file

Если выпросто есть begin и end без специальных символов, вы можете сделать:

awk 'BEGIN {s="begin";e="end"} $0~e {split($0,a,e);print a[1]e;exit} f; $0~s {split($0,a,s);print s a[2];f=1}' file
1 голос
/ 02 ноября 2019
$ awk 'sub(/.*\\begin.*/,"\\begin"){f=1} f{ f=!sub(/.*\\end.*/,"\\end"); print}' file
\begin
gdgs
\end
1 голос
/ 02 ноября 2019

РЕДАКТИРОВАТЬ: Так как OP немного изменил вопрос, поэтому добавление решения, как сейчас.

awk '
/\\caption/{
  next
}
match($0,/\\begin/){
  found=1
  print substr($0,RSTART,RLENGTH)
  next
}
match($0,/\\end/){
  found=""
  print substr($0,RSTART,RLENGTH)
  next
}
found
match($0,/word1/){
  found_word=1
  print substr($0,RSTART,RLENGTH)
  next
}
match($0,/word2/){
  found_word=""
  print substr($0,RSTART,RLENGTH)
  next
}
found_word
'  Input_file


Не могли бы вы попробоватьследующий.

awk '
/\\caption/{
  next
}
match($0,/\\begin/){
  found=1
  print substr($0,RSTART,RLENGTH)
  next
}
match($0,/\\end/){
  found=""
  print substr($0,RSTART,RLENGTH)
  next
}
found
' Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...