如何编写 sed 单行命令以在每第三个字符后添加一个字符?

如何编写 sed 单行命令以在每第三个字符后添加一个字符?

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

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

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

相关内容