Awk 在两种图案之间打印

Awk 在两种图案之间打印,awk,Awk,如何在两个图案之间使用awk打印,使这两个图案位于第一行和最后一行allone上,而不包含其他字符 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

如何在两个图案之间使用awk打印,使这两个图案位于第一行和最后一行allone上,而不包含其他字符

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
编辑:因为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
这应该做到:

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
这里的技巧部分是
\
,它确实需要在所有地方转义。如果它只是普通的字符,那就简单些
这里的诀窍是,我通过开始或停止标签分割线,只在开始后或停止前取我需要的东西

简单易读:

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
如果您只有
开始
结束
而没有特殊字符,则可以执行以下操作:

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
之前存储所有文本。试试我的测试文件。这可能/可能不适合你OP@Jotne,它是根据OP的示例编写的,先生。您添加的新脚本将打印
\\begin
word2
之间的行,等等。当关键字交错时,它仍然会失败,如果
\\end
word1
出现在自己的一行中,而没有前面的
\\begin
等,那么它将失败,并且使用所有不必要的重复代码不是一个好的做法。OP已经为他们的实际问题编写了一个新问题,因此没有必要对这个问题做任何其他事情。非常感谢。你能对你的解决方案多加评论吗?如何添加下一个图案?例如,在word1和word2之间?谢谢,我写了一个新问题,谢谢,以及如何添加另外两种模式?我编辑了我的问卷,这是一个不同的问题,需要不同的答案。把这个问题放回原样,接受答案,然后用新的示例输入/输出问一个新的独立后续问题。如果您还有其他问题需要解决,请确保在下一个问题中也包含这些问题,不要不断添加需求和更新问题。好的,我写一个新问题:谢谢您忘记将此问题恢复到原来的状态并接受该问题的答案。
$ awk 'sub(/.*\\begin.*/,"\\begin"){f=1} f{ f=!sub(/.*\\end.*/,"\\end"); print}' file
\begin
gdgs
\end