我想根据一些条件来打印文本:打印以\ 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
答案 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
(相同的输出)