정규식을 사용하여 기호와 일치하는 문자열로만 문자를 바꿉니다.

정규식을 사용하여 기호와 일치하는 문자열로만 문자를 바꿉니다.

기호 일치 목록을 검색하여 CSV의 두 번째 열에 있는 문자열을 바꾸거나 수정하는 방법에 대한 조언이 필요합니다.

이것은 내 파일입니다.csv

[Entry]
Date,20-02-2000
[Input]
SL,Name,Datasize,value
1,tg12.18.l,ch17,12.1
2,yo11`18.p,ch18,13.5
3,qk13_18.q,ch19,22.6
4,ls15-18.r,ch20,23.7
5,ew16'18.s,ch21,24.9

sed/awk를 실행한 후 예상되는 결과는 다음과 같습니다.

[Entry]
Date,20-02-2000
[Input]
SL,Name,Datasize,value
1,tg12_18_l,ch17,12.1
2,yo11_18_p,ch18,13.5
3,qk13_18_q,ch19,22.6
4,ls15-18_r,ch20,23.7
5,ew16_18_s,ch21,24.9

검색이 일치하면 아무 작업 -_수행하지 않습니다. 검색어가 일치하면 , < ` '밑줄 기호를 사용하여 바꿔야 합니다 _.

몇 가지 조합을 사용해 보았지만 awk작동하지 않습니다.

 awk -F, -v OFS=, 'sub(/\.\`\>\'/,"_",$2)+1' file.csv

어떤 아이디어라도 감사하겠습니다

답변1

편집하다: OP가 데이터를 편집했기 때문에. awk대신 지금 사용하는 것이 더 좋습니다 sed.

awk 'BEGIN{FS=OFS=","}/^[0-9]+,/{gsub(/[\.<`\x27]/,"_",$2);print;next}1' file.csv

답변2

그리고 perl:

perl -pi -e 's{^\d+,\K[^,]+}{$& =~ s/[^\w-]/_/gr}e' -- "$file"

( ) 이외의 하나 이상의 ( ) 문자와 하나 이상의 ( ) 십진수 및 줄 시작( +) 뒤의 하나(일치 시작 재설정)가 ( ) 이외의 문자로 대체되는 경우 동일한 ( ) ord 문자(숫자 또는 밑줄) 또는 로 대체됩니다.,[^,]^+\d\d,\K$&\w-_

따라서 실제로 첫 번째 필드가 모두 십진수로 구성된 경우 alnum을 제외한 문자 _와 두 번째 필드의 문자를 대체합니다.-

파일의 특정 테이블에 대한 일치를 제한하려면 다음을 수행할 수 있습니다.

perl -pi -e 's{^\d+,\K[^,]+}{$& =~ s/[^\w-]/_/gr}e if
               /^SL,Name/ .. /^\[/' -- "$file"

로 시작하는 줄 SL,Name과 로 시작하는 다음 줄 사이에서만 이러한 교체를 수행합니다 [.

파일의 내부 편집을 사용하여 파일의 각 줄에 대한 표현식을 평가하는 패턴을 적용합니다 -i( 줄은 저장되고 기본 변수는 다음과 같습니다.-psed-e$_s/pattern/replacement/flags패턴 공간존재하다 sed).

관련 정보