2 단어를 기반으로 sed를 한 다음 전체 줄을 변수로 바꿉니다.

2 단어를 기반으로 sed를 한 다음 전체 줄을 변수로 바꿉니다.

다음과 같은 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에만 영향을 미치게 하려면 두 패턴 중 하나와 일치하지 않는 행을 건너뛰십시오. 현재 행에 대한 편집 스크립트의 끝으로 분기되는 다음 명령을 사용하여 이 작업을 수행 할 수 있습니다 .bananawaitb

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되어 변수가 확장되지 않습니다.

이를 위해서는 개행 문자 없이 명령 텍스트를 입력할 수 있는 sedGNU와 같은 구현이 필요합니다.sedc

이는 또한 다음과 같이 값의 리터럴 개행 문자가 $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}'

관련 정보