在awk条件下打印文本

时间:2019-11-03 08:19:01

标签: awk

我想根据一些条件来打印文本:打印以\ hello(有效)开头的行,并且我不知道如何添加这样的条件以使\ a某些文本\ b:

\item[\word{\small 1}]: \a some text \b
\item[\word{\small 3}]: \a some text \b

我寻找一种条件,该条件将删除行的第一部分,除了数字\ item [\ word {\ small 1}]之外,该行总是相同的:或者一种条件,该条件将打印包括\ a和\ b之间的文本形成包含\ a和\ b的行。

    awk '
/\\hello/
/\\item\[\\word\{\\small ?\}\]\:/{
  next
}
' file.txt

file.txt:

text
\hello jgfk
4
5
\item[\word{\small 1}]: \a some text \b
\item[\word{\small 3}]: \a some text \b
456465
text
\hello hello

所需结果:

\hello jgfk
\a some text \b
\a some text \b
\hello hello

编辑

在代码不起作用的情况下:

\a
\b
\item[\textcircled{\tiny 1}]: \a \bb \perp \unit{\rho} \Rightarrow \bb \cdot\unit{\rho}=0 \b

输出应为:

\a \bb \perp \unit{\rho} \Rightarrow \bb \cdot\unit{\rho}=0 \b

2 个答案:

答案 0 :(得分:1)

请您尝试以下。

awk '/\\hello/; match($0,/\\a.*\\b/){print substr($0,RSTART,RLENGTH)}' Input_file

输出如下。

\hello jgfk
\a some text \b
\a some text \b
\hello hello

上述代码的解释:

awk '                                    ##Starting awk program here.
/\\hello/                                ##Checking condition if a line has string \hello then by not mentioning any action it will simply print the current line.
match($0,/\\a.*\\b/){                    ##Using match function of awk to match a REGEX where it matches from \\a till \\b of a line, here I have given 2 times \\ to make \ as a a literal character.
  print substr($0,RSTART,RLENGTH)        ##Printing sub-string from value of RSTART till value of RLENGTH, where RSTART and RLENGTH variables will be set when a regex is found by match function.
}                                        ##Closing BLOCK for match function.
' Input_file                             ##mentioning Input_file name here.


来自man awk匹配函数的定义:

  

match(s,r)返回常规的第一个最长匹配的索引   字符串s中的表达式r。如果不匹配,则返回0。副作用   RSTART设置为返回值.RLENGTH设置为返回值的长度   匹配或-1(如果不匹配)。如果空字符串匹配,则RLENGTH为   设置为0,如果匹配项位于最前面,则返回1,并且   如果匹配项位于后面,则返回length + 1。

     

RLENGTH长度由上次调用内置函数设置的长度,   match()RSTART索引由上一次对match()的调用设置

答案 1 :(得分:1)

您对@RavinderSingh13有一个很好的答案,但是也可以使用规则和next之前的条件来完成此操作,例如

awk -F': ' 'NF==2 {print $2; next} $1~/^[\\]/' file

-F': '处将字段分隔符设置为": ",然后NF==2检查是否有2个字段,如果有,则输出第二个字段并调用next跳过其余规则并获得下一条记录。第二条规则检查第一个字符是否为'\',如果是,则打印记录。

使用/输出示例

file中输入

$ awk -F': ' 'NF==2 {print $2; next} $1~/^[\\]/' file
\hello jgfk
\a some text \b
\a some text \b
\hello hello

注意:如果有可能您的行中有2个非以'\'开头的字段,而您不想包含这些行,则可以添加限制条件只考虑以'\'开头的行以输出:

awk -F': ' '$1~/^[\\]/ {if (NF==2) print $2; else print $0}' file

(相同的输出)