awk 또는 sed를 사용하여 이전 명령의 변수를 기반으로 파일에서 줄을 삭제합니다.

awk 또는 sed를 사용하여 이전 명령의 변수를 기반으로 파일에서 줄을 삭제합니다.

문자열과 숫자가 포함된 CSV 파일(예: temp.csv)이 있습니다. 줄 시작 부분에 특정 문자열 패턴이 포함된 파일의 줄을 삭제해야 합니다. 예를 들어, 이것은 내 파일입니다.

req1,incl_patt1,excl_patt1,2,ind1
req1,incl_patt2,excl_patt2,1,ind1
req1,incl_patt3,excl_patt3,4,ind1
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

req_file_curr명령에 패턴을 작성 중입니다.~ $ req_file_curr=req1

echo "${req_file_curr}"다음과 같이 출력을 제공합니다.req1

그러나sed아래와 같이 명령을 실행합니다.

sed '/\"${req_file_curr}\"/d' temp.csv

다음과 같이 출력을 제공합니다.

req1,incl_patt1,excl_patt1,2,ind1
req1,incl_patt2,excl_patt2,1,ind1
req1,incl_patt3,excl_patt3,4,ind1
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

출력이 될 것으로 예상합니다.

req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

쉘의 변수를 패턴으로 사용하여 찾는 방법sed또는awk?

답변1

sed쉘이 변수를 전달하기 전에 변수를 확장할 수 있도록 패턴을 큰따옴표로 묶어야 합니다 sed.

sed "/^${req_file}/d" temp.csv

또한 이 패턴이 선의 시작 부분에 나타나야 함을 ^나타내기 위해 앵커 포인트를 사용해야 합니다 .sed

답변2

필요 없음 awk또는 sed여기:

grep -v "^$req_file_curr," file

(예: for sed또는 정도는 낮지만) 정규식 연산자(예 : , ...)가 포함되지 않는다고 awk가정합니다 .$req_file_curr.*

그렇다면 이러한 문자를 이스케이프해야 하거나 를 사용하고 해당 기능을 사용하는 메서드를 awk사용할 수 있습니다 .index()

S="$req_file_curr," awk 'index($0, ENVIRON["S"]) != 1' < file

답변3

설정했지만 req_file_curr을 사용하면 명령에서 쉘 변수를 확장할 수 없기 때문에 req_file명령 sed이 작동하지 않습니다 sed.

다음을 시도해 볼 수 있습니다.

$ sed '/'"${req_file_curr}"'/d' file
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

또는 sed큰따옴표를 사용하세요.

sed "/${req_file_curr}/d" file

그리고 사용 awk:

$ awk -v req=$req_file_curr '$0 !~ req' file
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

답변4

ed 솔루션은 이렇습니다.

  req_file_curr=req1

  printf '%s\n' "g/^$req_file_curr/d"  w | ed -s temp.csv

파일을 내부에서 편집하므로 파일에서 이를 실행하기 전에 테스트하십시오.

관련 정보