작은 편집 문자열이 포함된 파일에서 줄을 복사하는 방법을 찾아야 합니다. 복제품은 원래 줄 위에 나타나야 합니다. 그것이 최선의 선택이 될까요 sed
?awk
이상적으로 puppies
는 새 줄로 바꾸고 교체하는 것이 좋습니다.bunnies
I
You
예를 들어:
- 입력 파일:
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 }
'