Awk 提取所选字母的相邻字符

Awk 提取所选字母的相邻字符,awk,sed,grep,Awk,Sed,Grep,我有这个文本文件: # cat letter.txt this is just a test to check if grep works 字母“e”有三个单词 # grep e letter.txt test check grep 有没有办法返回打印在所选字符左侧的字母 expected.txt t h r 您可以使用正向前瞻来匹配后跟e的字符,而无需将e作为匹配的一部分 cat letter.txt | grep -oP '.(?=e)' 使用sed: sed -nE 's/.*(.

我有这个文本文件:

# cat letter.txt
this
is
just
a
test
to
check
if
grep
works
字母“e”有三个单词

# grep e letter.txt
test
check
grep
有没有办法返回打印在所选字符左侧的字母

expected.txt
t
h
r
您可以使用正向前瞻来匹配后跟
e
的字符,而无需将
e
作为匹配的一部分

cat letter.txt | grep -oP '.(?=e)'
使用
sed

sed -nE 's/.*(.)e.*/\1/p' letter.txt

awk
中显示了示例,请尝试以下内容

awk '/e/{print substr($0,index($0,"e")-1,1)}' Input_file
说明:添加上述内容的详细说明

awk '             ##Starting awk program from here.
/e/{              ##Looking if current line has e in it then do following.
  print substr($0,index($0,"e")-1,1)
                  ##Printing sub string from starting value of index e-1 and print 1 character from there.
}
' Input_file      ##Mentioning Input_file name here.

使用GNU
awk
可以使用空字符串作为FS将输入拆分为单个字符:

awk -v FS= '/[e]/ {for(i=2;i<=NF;i++) if ($i=="e") print $(i-1)}' file
t
h
r

awk-vfs='/^[e]/{print”“}/[e]/{for(i=2;i假设您有以下输入文件:

cat文件
这
是
只是
A.
测试
到
检查
如果
格雷普
作品
鸡蛋
要素
您可以使用此
grep+sed
解决方案在
e
之前查找字母或空字符串:

grep-oE'(^ |)e'文件| sed's/$/'
T
H
R
L
M
或者,这个单独的
awk
命令也可以工作:

awk-F'e''NF>1{
对于(i=1;i这可能适用于您(GNU-sed):

关闭隐式打印并启用扩展regexp
-nE

只关注符合要求的行,即在
e
之前包含字符

用换行符围绕所需字符

删除第一个换行符之前的所有字符

打印第一行(直到第二个换行)

删除第一行(包括换行符)

重复一遍

注意:解决方案将在单独的行上打印每个此类字符

要在自己的行上打印所有此类字符,请使用:

sed -nE '/(.e)/{s//\n\1/g;s/^/e/;s/e[^\n]*\n?//g;s/\B/ /g;p}' file

注意:如果不需要空格分隔,请删除
s/\B/g

如果将单词错误地附加到列表中,预期的输出是什么?如果行是
egg
?是否打印空字符串?是。如果e是单词中的第一个字符,则为空字符串。如果有多个
e
s,如
元素?'lm'我正试图找到“e”喜欢跟随的所有字符:)
awk -v FS= '/^[e]/ {print ""} /[e]/ {for(i=2;i<=NF;i++) if ($i=="e") print $(i-1)}' file2
r

n

W
n

f
v
sed -nE '/(.)e/{s//\n\1\n/;s/^[^\n]*\n//;P;D}' file
sed -nE '/(.e)/{s//\n\1/g;s/^/e/;s/e[^\n]*\n?//g;s/\B/ /g;p}' file