세 번째 문자마다 문자를 추가하는 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+ -

즉, 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 인터프리터는 입력을 반복하는 옵션을 사용하여 실행하여 rubysed 및 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

후행 "+"는 추가되지 않습니다.

관련 정보