字符串中的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
    数组
从0开始计算位置,因此需要从数字中减去1

bash
及其模式扩展类似的方法:

while read w p ; do echo ${w:p-1:1} ; done < input.txt
  • cat-n
    对行进行编号,这些编号将用作生成的
    sed
    脚本中的“地址”
  • 第二行生成一个sed脚本,该脚本对特定地址(即行号)应用预期操作。以下是为您的输入生成的脚本:

    1s=.\{3\}\(.\).*=\1=
    2s=.\{2\}\(.\).*=\1=
    3s=.\{2\}\(.\).*=\1=
    4s=.\{7\}\(.\).*=\1=
    5s=.\{8\}\(.\).*=\1=
    6s=.\{6\}\(.\).*=\1=
    
  • 最后一行运行生成的
    sed
    脚本。由于数字又从1变为1,我们必须预先加上一些东西(
    X

  • Perl中的Easy:

    perl -ane 'print substr $F[0], $F[1] - 1, 1' input.txt
    
    • -n
      逐行读取输入
    • -a
      将空格上的每一行拆分为
      @F
      数组
    从0开始计算位置,因此需要从数字中减去1

    bash
    及其模式扩展类似的方法:

    while read w p ; do echo ${w:p-1:1} ; done < input.txt
    
  • cat-n
    对行进行编号,这些编号将用作生成的
    sed
    脚本中的“地址”
  • 第二行生成一个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。直截了当的