我正在使用cygwin。
我已经知道我手中的line#。脚本应查找mono
指定行号上方字符串的第一次出现,并查找指定行号下方字符串的第一次出现,并仅返回和/mono
之间的内容。 mono
/mono
输入:
I have known line # in my hand.
Script should look for the first occurrence of word mono
not monoono
above a specified line #
and look for the
first occurrence of word /mono below the specified line #s
and return ONLY the contents between those 'mono' and /mono
预期输出
mono
not monoono
above a specified line #
and look for the
first occurrence of word /mono
我怎样才能做到这一点?
答案1
GNU 的紧凑版本sed
:
sed -E 'H;4!d;g;s/.*\<mono\>/mono/;:a;N;s_/mono\>.*_/mono_;Ta' in
解释:
H
收集保留空间中的所有行4!d
抑制除第四行之外的所有输出- 在第 4 行,将保留空间移动到模式空间 ( ) 并使用命令删除
g
单词之前的所有内容mono
s
:a; ... ;Ta
形成一个循环,附加行N
直到/mono
被读取
答案2
awk -v L=4 '(NR<L && $0 ~ /\<mono\>/){Pnr=NR;gsub(/^.*\<mono\>/,"mono"); P=$0;next}
(!Nnr && $0 ~ /\/\<mono\>/){Nnr=NR;gsub(/\/\<mono\>.*/,"/mono"); N=$0}
(NR!=FNR && P){print P;P=""}(FNR>Pnr && FNR <Nnr ){print} END{print N}' in in
mono
将产生~之间的结果/mono
:此处在特定第 4 行周围首次出现。
mono
not monoono
above a specified line #
and look for the
first occurrence of word /mono
如果您不想在匹配后匹配行图案,这将是最短的:
awk -v L=4 '(NR<L && $0 ~ /\<mono\>/){Pnr=NR;next}
(!Nnr && $0 ~ /\/\<mono\>/){Nnr=NR}
(FNR>Pnr && FNR <Nnr)' in in