字符串中的Sed索引号
如何使用数字将字符串中的某个字母与字符串中的Sed索引号,sed,Sed,如何使用数字将字符串中的某个字母与sed匹配 例如: and 3 now 2 for 2 something 7 completely 8 different 6 kent$ cat f and 3 now 2 for 2 something 7 completely 8 different 6 kent$ sed -rn 's/(\S+)\s*([0-9]+)/w="\1";echo -e "${w:$((\2-1)):1}"/ge;H;${x;s/\n//g;p}' f dooie
sed
匹配
例如:
and 3
now 2
for 2
something 7
completely 8
different 6
kent$ cat f
and 3
now 2
for 2
something 7
completely 8
different 6
kent$ sed -rn 's/(\S+)\s*([0-9]+)/w="\1";echo -e "${w:$((\2-1)):1}"/ge;H;${x;s/\n//g;p}' f
dooier
这个例子的输出应该是“dooier”。如果数字是3,则取字符串的第三个字母,如果是4,则取字符串的第四个数字
我可以简单地用awk
来解决这个问题,但是有没有办法用sed
来解决这个问题呢
提前谢谢 这在使用
sed
时是不可能的,但是在使用awk时是可能的:
awk '{w=w""substr($1,$2,1)} END{printf "%s\n",w}' input.txt
这在
sed
中是不可能的,但是在awk中是可能的:
awk '{w=w""substr($1,$2,1)} END{printf "%s\n",w}' input.txt
Perl中的Easy:
perl -ane 'print substr $F[0], $F[1] - 1, 1' input.txt
逐行读取输入-n
将空格上的每一行拆分为-a
数组@F
bash
及其模式扩展类似的方法:
while read w p ; do echo ${w:p-1:1} ; done < input.txt
cat-n
对行进行编号,这些编号将用作生成的sed
脚本中的“地址”1s=.\{3\}\(.\).*=\1=
2s=.\{2\}\(.\).*=\1=
3s=.\{2\}\(.\).*=\1=
4s=.\{7\}\(.\).*=\1=
5s=.\{8\}\(.\).*=\1=
6s=.\{6\}\(.\).*=\1=
sed
脚本。由于数字又从1变为1,我们必须预先加上一些东西(X
)perl -ane 'print substr $F[0], $F[1] - 1, 1' input.txt
逐行读取输入-n
将空格上的每一行拆分为-a
数组@F
bash
及其模式扩展类似的方法:
while read w p ; do echo ${w:p-1:1} ; done < input.txt
cat-n
对行进行编号,这些编号将用作生成的sed
脚本中的“地址”1s=.\{3\}\(.\).*=\1=
2s=.\{2\}\(.\).*=\1=
3s=.\{2\}\(.\).*=\1=
4s=.\{7\}\(.\).*=\1=
5s=.\{8\}\(.\).*=\1=
6s=.\{6\}\(.\).*=\1=
sed
脚本。由于数字又从1变为1,我们必须预先加上一些东西(X
)cat letters.txt | sed's/^(.*)\([0-9]\)/echo\1 | cut-c\2/'| bash | paste-s | sed's/[^a-z]*//g'
我也用
sed
解决了一些问题,但它更多的是代码:p cat letters.txt|sed's/^(.*)\([0-9]\)/echo\1|cut-c\2/'| bash | paste-s|sed's/[^a-z]*//g'
我也用sed
解决了一些问题,但它更多的是代码:p 仅sed解决方案(需要gnu sed):
用您的示例进行测试:
and 3
now 2
for 2
something 7
completely 8
different 6
kent$ cat f
and 3
now 2
for 2
something 7
completely 8
different 6
kent$ sed -rn 's/(\S+)\s*([0-9]+)/w="\1";echo -e "${w:$((\2-1)):1}"/ge;H;${x;s/\n//g;p}' f
dooier
关键是使用gnu sed的ge
功能。sed唯一解决方案(需要gnu sed):
用您的示例进行测试:
and 3
now 2
for 2
something 7
completely 8
different 6
kent$ cat f
and 3
now 2
for 2
something 7
completely 8
different 6
kent$ sed -rn 's/(\S+)\s*([0-9]+)/w="\1";echo -e "${w:$((\2-1)):1}"/ge;H;${x;s/\n//g;p}' f
dooier
关键是使用gnu sed的
ge
功能。它可以通过sed以某种方式解决,因为我们不允许在练习中使用awk。谢谢你!我们不允许使用awk听起来像是学校的工作。告诉你的老师,只有sed不可能完成这项工作,这里使用的工具是awk
。sed可以以某种方式解决这个问题,因为我们不允许在练习中使用awk。谢谢你!我们不允许使用awk听起来像是学校的工作。告诉你的老师,只有sed不可能完成这项工作,而且这里使用的工具是awk
。如果你使用gnu sed的ge
选项,这是作弊吗?你可以确切使用哪些工具?只有sed
(哪个版本)、shell(哪个版本)、cut
…?我们使用sed4.2.2、bashshell,除了awk@Kent不,可能不允许Perl?!如果你使用gnu sed的ge
选项,这是作弊吗?你能准确使用哪些工具?只有sed
(哪个版本)、shell(哪个版本)、cut
…?我们使用sed4.2.2、bashshell,除了awk@Kent不,可能不允许Perl?!那是怎样的sed-only
?它使用了GNU sed的非标准功能,并启动了一个shell来完成此任务。@hek2mgl我问OP GNU sed是否正常,他给出了积极的反馈。它使用了一个额外的回音。我们需要的外壳,对吧?看来我不喜欢这种问题。这看起来像家庭作业,但老师如何分配任务:“用sed做一个典型的awk作业”?你看,所有的答案都是可怕的黑客,没有人会在生产中使用(希望如此!)…@hek2mgl当然,如果我这样做,我也会选择awk。直截了当。这是怎么回事?它使用了GNU sed的非标准功能,并启动了一个shell来完成此任务。@hek2mgl我问OP GNU sed是否正常,他给出了积极的反馈。它使用了一个额外的回音。我们需要的外壳,对吧?看来我不喜欢这种问题。这看起来像家庭作业,但老师如何分配任务:“用sed做一个典型的awk作业”?你看,所有的答案都是可怕的黑客,没有人会在生产中使用(希望如此!)…@hek2mgl当然,如果我这样做,我也会选择awk。直截了当的