다음과 같은 txt 파일이 있습니다.
1:Ana:apple:08:00:wait
1:Joe:banana:08:30:wait
1:Oscar:orange:08:45:ready
1:Monica:apple:08:50:ready
1:Mark::orange:ready
내가 찾아야 해첫 번째 줄만두 단어가 포함되어 있으며,"바나나" 그리고 "잠깐"그 다음에전체 라인 교체그리고$myvar
지금까지 이 코드를 시도해 보았지만 동시에 두 단어를 일치시키는 데 몇 가지 문제가 있는 것 같습니다.
sed -i "0,/banana.wait/c\$myvar" myfile
나를 도와줄 수 있는 사람 덕분에
답변1
명령이 및 를 모두 포함하는 행 c
에만 영향을 미치게 하려면 두 패턴 중 하나와 일치하지 않는 행을 건너뛰십시오. 현재 행에 대한 편집 스크립트의 끝으로 분기되는 다음 명령을 사용하여 이 작업을 수행 할 수 있습니다 .banana
wait
b
sed -e '/banana/!b' -e '/wait/!b' -e "c\\$myvar" file
c
현재 행이 일치하지 않거나 banana
( wait
어떤 순서로든) 명령을 건너뜁니다.
순서가 중요한 경우 ( banana
이전 wait
)을 사용하십시오.
sed -e '/banana.*wait/!b' -e "c\\$myvar" file
banana
하위 문자열(예: only 및 not ) 이 아닌 전체 단어를 일치시키는 것이 중요한 경우 각 단어를 또는 로 bananas
묶어 단어 경계가 올바르게 일치하는지 확인하세요.\<...\>
\b...\b
이중 백슬래시를 참고하세요. 이는 큰따옴표로 묶인 문자열 안에 단일 백슬래시를 삽입하는 방법입니다. $
에서는 단일 백슬래시가 이스케이프 $myvar
되어 변수가 확장되지 않습니다.
이를 위해서는 개행 문자 없이 명령 텍스트를 입력할 수 있는 sed
GNU와 같은 구현이 필요합니다.sed
c
이는 또한 다음과 같이 값의 리터럴 개행 문자가 $myvar
리터럴 백슬래시 문자를 사용하여 이스케이프된다고 가정합니다.
myvar='hello\
world'
입력 데이터가 필드가 있는 레코드로 구성되어 있고 어떤 필드가 무엇이고 banana
어떤 필드가 중요한지 확인하는 경우 예를 들어 다음을 wait
사용하여 레코드를 올바르게 구문 분석할 수 있습니다 .awk
value=$myvar awk -F : '$3 == "banana" && $NF == "wait" { $0 = ENVIRON["value"] }; 1' file
이는 마지막 필드인 세 번째 필드 banana
(정규식 하위 문자열 테스트가 아닌 정확한 문자열 테스트)를 명시적으로 테스트하고 wait
현재 레코드를 환경 변수로 전달된 지정된 값으로 바꿉니다 value
.
답변2
프레임워크 과제: sed는 이 문제에 대한 최선의 도구가 아닙니다.
Awk에서는 순서에 관계없이 일치 항목을 결합할 수 있습니다 /banana/ && /wait/
.
또는 특정 필드를 정확하게 일치시킬 수도 있습니다.
awk -F: -v repl="$myvar" -e '$3 == "banana" && $6 == "wait" { $0 = repl } {print}'