POSIX:abcdef 到 ab bc cd de ef

oct*_*pus 10 shell awk posix sed

使用 POSIXsedawk,我想在每对相邻字符中复制每个第二个字符,并在新行上列出每个新形成的对。

示例.txt:

abcd 10001.
Run Code Online (Sandbox Code Playgroud)

预期结果:

ab
bc
cd
d 
 1
10
00
00
01
1.
Run Code Online (Sandbox Code Playgroud)

到目前为止,这就是我所拥有的(注意,如果在 macOS 上,请省略“--posix”)。出于某种原因, 在之前添加文字换行符\2不会产生预期的结果。删除第一组并使用\1具有相同的效果。我错过了什么?

sed --posix -E -e 's/(.)(.)/&\2\
/g' example.txt

abb
cdd
100
000
1..
Run Code Online (Sandbox Code Playgroud)

daw*_*awg 11

尝试:

$ echo "abcd 10001." | awk '{for(i=1;i<length($0);i++) print substr($0,i,2)}'
ab
bc
cd
d 
 1
10
00
00
01
1.
Run Code Online (Sandbox Code Playgroud)

  • 我无法想象为什么有人会投反对票,因为这是一个强大的、可移植的解决方案,可以在任何 shell 中使用任何 awk 来处理所有 UNIX 系统上的任何输入。 (4认同)

Wik*_*żew 5

您可以使用

sed --posix -e 's/./&\
&/g' example.txt | sed '1d;$d'
Run Code Online (Sandbox Code Playgroud)

第一个sed命令查找字符串中的每个字符并替换为相同的字符,然后是换行符,然后是相同的字符。由于它替换了第一个和最后一个字符,因此必须删除第一个和最后一个结果行,这是通过sed '1d;$d'.

如果sed支持环视,则可以使用(?!^).(?!$)(任何字符,但不在字符串的开头或结尾处)并且sed不需要最后一个命令,但使用sed. perl不过,您可以使用它perl -pe 's/(?!^).(?!$)/$&\n$&/g' example.txt(参见在线演示$&在 RHS 中与&占位符相同sed,整个匹配值)。


Rav*_*h13 5

使用 GNU awk,您可以尝试以下操作。使用所示样本进行编写和测试,并在链接https://ideone.com/qahp0S 中进行测试

awk '
BEGIN{
  FS=""
}
{
  for(i=1;i<=(NF-1);i++){
    print $i$(i+1)
  }
}
' Input_file
Run Code Online (Sandbox Code Playgroud)

说明:在程序的BEGIN 部​​分为此处的所有行设置字段分隔符为NULL。然后在主程序中运行一个 for 循环,该循环从第一个字段运行到最后一个字段的第二个字段。在该循环的每次迭代中打印当前和下一个字段。