편집된 문자열이 포함된 중복 라인 [닫기]

편집된 문자열이 포함된 중복 라인 [닫기]

작은 편집 문자열이 포함된 파일에서 줄을 복사하는 방법을 찾아야 합니다. 복제품은 원래 줄 위에 나타나야 합니다. 그것이 최선의 선택이 될까요 sed?awk

이상적으로 puppies는 새 줄로 바꾸고 교체하는 것이 좋습니다.bunniesIYou

예를 들어:

  • 입력 파일:
    I have puppies cute 
    I have two kitties
    I have three puppies cute
    I have four kitties
    
  • 결과는 다음과 같습니다.
    You have bunnies cute
    I have puppies cute
    I have two kitties
    You have three bunnies cute 
    I have three puppies cute
    I have four kitties
    

답변1

GNU 사용 sed:

sed 'h; s/puppies/bunnies/g; T; s/I/You/; G' < your-file

답변2

를 사용 sed하고 트리거가 cute줄 끝에 있는 하위 문자열이라고 가정합니다.

sed '/cute[[:blank:]]*$/ { h; s/^I/You/; s/[[:alpha:]]* cute/bunnies cute/; G; }' file

패턴 [[:blank:]]*에는 후행 공백이나 줄 끝의 탭이 허용됩니다 (질문의 첫 번째 줄에는 후행 공백이 있습니다).

이렇게 하면 텍스트가 생성됩니다.

You have bunnies cute
I have puppies cute
I have two kitties
You have three bunnies cute
I have three puppies cute
I have four kitties

h명령은 "예약된 공간"에 현재 줄의 복사본을 저장합니다. 첫 번째 s///명령은 I로 시작하는 줄을 변경하고, 두 번째 명령은 You로 시작하는 모든 cute단어를 변경합니다 bunnies. 이 G명령은 예약된 공간의 원래 줄을 현재(수정된) 줄의 끝까지 추가하고 그 사이에 줄 바꿈을 추가합니다.


변형:

sed '/[[:alpha:]]* \(cute[[:blank:]]*\)$/ { h; s//bunnies \1/; s/^I/You/; G; }' file

이는 명령에서 정규식을 비워두면 s///최신 정규식이 사용된다는 사실을 활용합니다.


puppies대신 문자열에 의해 트리거되는 변형입니다 cute. 이렇게 하면 길이가 약간 짧아집니다.

sed '/puppies/ { h; s//bunnies/; s/^I/You/; G; }' file

답변3

사용 awk:

awk 'function prnt() { print edit ORS hold; hold=edit="" }
     hold            { prnt() }
     /puppies/       { hold=$0; $1="you"; gsub("puppies", "bunnies"); edit=$0; next }
END{ if(hold) prnt() }1' infile

답변4

gnu sed그리고 branches:

sed '
s/puppies/&/g; tfind
n
:find 
    h
    s/puppies/bunnies/g
    s/^I/You/
    G
'

gawk:

awk '$0~/puppies/ {

 original=$0
 sub(/puppies/, "bunnies")
 sub(/^I/, "You")
 print $0, original
 next
} 
{ print }
'

관련 정보