所以,我有一个看起来像这样的字符串:
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
由于您不想要尾随+
,因此您可以这样做:
fold -w3 | paste -sd+ -
也就是说,字符idthfold上的行,以及以精灵作为分隔符的那 3 个字符行,实际上就像将除最后一个换行符之外的每个换行符更改为.如果输入有多于一行,您最终会得到这些行与 a 的连接,这可能是也可能不是您想要的。3wpastes+d+
+
如果您确实需要它sed
,您可以删除后面的尾随+
:
sed 's/.../&+/g;s/+$//'
答案2
sed 's/.../&+/g'
为了让你的方式工作,你不需要转义{}
符号:
sed -r 's/([A-Z]{3})/\1+/g'
答案3
这可能对你有用(GNU sed):
sed 's/...\B/&+/g' file
答案4
如果 sed 不是必须的,那么使用 Ruby 可能是一种替代方案。 Ruby 解释器ruby
可以像 sed 和 awk 一样使用,-n
方法是使用使其迭代其输入的选项来运行它。然后,可以通过将 Ruby 单行代码添加为选项的参数-e
(告诉解释器解释 的参数,-e
而不是在文件中查找脚本)来向解释器提供 Ruby 单行代码。
对于这个特殊问题,您可以使用以下单行代码(改编自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
请注意,它不会添加任何尾随“+”。