如何使用数字来匹配字符串中的某个字母sed
。
例如:
and 3
now 2
for 2
something 7
completely 8
different 6
此示例的输出应为'dooier'。如果数字是3,你取字符串的第三个字母,如果它是4,你取第四个数字的字符串,...
我可以使用awk
执行此操作但是有一种方法可以使用sed
来解决此问题吗?
提前致谢!
答案 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 )
cat -n
对这些行进行编号,这些数字将在生成的sed
脚本中用作“地址”。第二行生成一个sed脚本,该脚本对特定地址(即行号)应用预期操作。这是您输入的生成脚本:
1s=.\{3\}\(.\).*=\1=
2s=.\{2\}\(.\).*=\1=
3s=.\{2\}\(.\).*=\1=
4s=.\{7\}\(.\).*=\1=
5s=.\{8\}\(.\).*=\1=
6s=.\{6\}\(.\).*=\1=
最后一行运行生成的sed
脚本。当数字再次关闭1时,我们必须先添加一些内容(X
)。
答案 1 :(得分:2)
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!