字符串中的sed索引号

时间:2016-01-05 11:00:32

标签: sed

如何使用数字来匹配字符串中的某个字母sed

例如:

and 3
now 2
for 2
something 7
completely 8
different 6

此示例的输出应为'dooier'。如果数字是3,你取字符串的第三个字母,如果它是4,你取第四个数字的字符串,...

我可以使用awk执行此操作但是有一种方法可以使用sed来解决此问题吗?

提前致谢!

4 个答案:

答案 0 :(得分:2)

Perl很容易:

perl -ane 'print substr $F[0], $F[1] - 1, 1' input.txt
  • -n逐行读取输入行
  • -a将空格上的每一行拆分为@F数组

substr从0开始计算位置,因此您需要从数字中减去1。

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

while read w p ; do echo ${w:p-1:1} ; done < input.txt

最后,sed(3次)与cat,bash语法:

cat -n input.txt \
| sed 's/\t[^ ]* /s=.\\{/;s/$/\\}\\(.\\).*=\\1=/' \
| sed -f- <( sed 's/^/X/' input.txt )
  1. cat -n对这些行进行编号,这些数字将在生成的sed脚本中用作“地址”。
  2. 第二行生成一个sed脚本,该脚本对特定地址(即行号)应用预期操作。这是您输入的生成脚本:

    1s=.\{3\}\(.\).*=\1=
    2s=.\{2\}\(.\).*=\1=
    3s=.\{2\}\(.\).*=\1=
    4s=.\{7\}\(.\).*=\1=
    5s=.\{8\}\(.\).*=\1=
    6s=.\{6\}\(.\).*=\1=
    
  3. 最后一行运行生成的sed脚本。当数字再次关闭1时,我们必须先添加一些内容(X)。

答案 1 :(得分:2)

仅限sed解决方案(需要gnu sed):

 sed -rn 's/(\S+)\s*([0-9]+)/w="\1";echo -e "${w:$((\2-1)):1}"/ge;H;${x;s/\n//g;p}' file

用你的例子测试:

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功能。

答案 2 :(得分:1)

sed无法做到这一点,但可以使用awk:

awk '{w=w""substr($1,$2,1)} END{printf "%s\n",w}' input.txt

答案 3 :(得分:0)

cat letters.txt | sed 's/^\(.*\) \([0-9]\)/echo \1 | cut -c \2/'| bash | paste -s | sed 's/[^a-z]*//g'

我还想通过sed找出一些东西,但它的代码更多:p!