oct*_*pus 10 shell awk posix sed
使用 POSIXsed或awk,我想在每对相邻字符中复制每个第二个字符,并在新行上列出每个新形成的对。
示例.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)
您可以使用
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,整个匹配值)。
使用 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 循环,该循环从第一个字段运行到最后一个字段的第二个字段。在该循环的每次迭代中打印当前和下一个字段。