세 번째 문자마다 문자를 추가하기 위해 sed one-liner를 어떻게 작성합니까?


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

답변:


16

후행을 원하지 않기 때문에 다음을 수행 +할 수 있습니다.

fold -w3 | paste -sd+ -

즉, 문자 idth fold의 행과 3문자가 있는 3 개의 문자 행 은 모든 줄 바꿈 문자를 제외한 마지막 문자를로 변경하는 것과 같은 elimiter 로 엘프 를 사용합니다 . 입력에 둘 이상의 라인이 있으면 원하는 라인 이 될 수도 있고 아닐 수도 있는 라인으로 끝납니다 .wpastes+d++

필요한 경우 다음 sed후행 +을 제거 할 수 있습니다 .

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

작동 방식에 대한 간단한 설명을 추가해 주시겠습니까?
NN

@NN +$줄 끝 직전에 더하기 기호와 일치 하기 때문에 작동 합니다.
Chris Down

fold -w3문자열을 3 개의 문자 라인으로 나눕니다. paste -sd+ -개행을로 바꿉니다 +.
bahamat

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하는 -n옵션으로 sed 및 awk처럼 사용할 수 있습니다 . 그런 다음 인터프리터는 -e옵션에 인수로 추가하여 Ruby one-liner를 제공 할 수 있습니다 ( -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

후행 '+'는 추가하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.