그래서 다음과 같은 문자열이 있습니다.
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+ -
즉, fold문자 ID에 있는 줄과 구분 기호로 스프라이트가 있는 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 one-liner를 옵션에 인수로 추가하여 인터프리터에 제공할 수 있습니다 ( 파일에서 스크립트를 찾는 대신 -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
후행 "+"는 추가되지 않습니다.