문자열과 숫자가 포함된 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
파일을 내부에서 편집하므로 파일에서 이를 실행하기 전에 테스트하십시오.