如何编写sed单线在每第三个字符后添加一个字符?


10

所以,我有一个看起来像这样的字符串:

AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUGA

我想将字符串分成3个字符的块,并用'+'号分隔。

AUG+GCC+AUG+GCG+CCC+AGA+ACU+GAG+AUC+AAU+AGU+ACC+CGU+AUU+AAC+GGG+UGA

我想和我的好朋友做到这一点sed

我试过了

cat codons | sed -r 's/([A-Z]\{3\})/\1\+/g'

...没有成功。

sed可以使用什么命令?


1
这不和罗莎琳德有联系吗?只是好奇。
m0nhawk 2012年

Answers:


16

由于您不希望尾随+,因此可以执行以下操作:

fold -w3 | paste -sd+ -

也就是说,字符idth fold上的行以及与之对应的那3个字符行以精灵作为分隔符,实际上就像将每个换行符(但最后一个换成一个)都变成了。如果输入有多行,您将最终得到那些与a相连的行,该行可能是您想要的,也可能不是您想要的。3wpastes+d++

如果确实需要它sed,可以在以下位置删除结尾+

sed 's/.../&+/g;s/+$//'

您介意对其进行简短说明吗?
NN

@NN之所以起作用,是因为在行+$的末尾立即匹配加号。
克里斯·

fold -w3将字符串分成3个字符行。paste -sd+ -把换行符变成+
bahamat 2012年

12
sed 's/.../&+/g'

为了让您的工作正常,您不需要转义{}符号:

sed -r 's/([A-Z]{3})/\1+/g'

1
谁知道!我离现在还很近...谢谢...
ixtmixilix

两者都添加尾随的“ +”。这是故意的吗?
NN

2

这可能对您有用(GNU sed):

sed 's/...\B/&+/g' file

0

如果不是必须使用sed,则可以使用Ruby。Ruby解释器ruby可以与sed和awk一起使用,只需运行带有-n使其在输入中进行迭代的选项即可。然后,可以通过将Ruby单行代码作为-e选项的参数添加到解释器中(该解释器告诉解释器解释参数-e而不是在文件中查找脚本)。

对于此特定问题,您可以使用以下单行代码(改编自https://stackoverflow.com/a/3184271/789593):

ruby -ne 'puts $_.scan(/.{3}|.+/).join("+")'

用简单的语言

  • 匹配scan(/.{3}|.+/)输入字符串中的任何3个字符或至少一个字符$_(在这种情况下,输入应来自标准输入),并将每个匹配项放入一个数组中,
  • 将数组连接成一个字符串,并用'+'连接每个元素join("+")
  • 并打印它以换行符终止puts

例如

echo "AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUG" | ruby -ne 'puts $_.scan(/.{3}|.+/).join("+")'
AUG+GCC+AUG+GCG+CCC+AGA+ACU+GAG+AUC+AAU+AGU+ACC+CGU+AUU+AAC+GGG+UG

请注意,它不会添加任何尾随的“ +”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.