sed를 사용하여 일치하는 문자열의 n번째 위치에 문자를 추가합니다.

sed를 사용하여 일치하는 문자열의 n번째 위치에 문자를 추가합니다.

일치하는 문자열의 n번째 위치(이 경우 두 번째)에 문자를 추가해야 합니다. 예를 들어 파일에서 문자열 앞과 포함된 문자열 뒤에 text.txtN을 추가하고 싶습니다."blah

텍스트.txt:

"1blah8","na","8blah4"  
"2blah5","na","10blah4"  
"5blah5","na","1blah234"  

text2.txt를 얻고 싶습니다.

"Ν1blah8","na","Ν8blah4"  
"Ν2blah5","na","Ν10blah4"  
"Ν5blah5","na","Ν1blah234"  

나는 이것을 시도했지만 sed 's/.*blah.*/N&/' text.txt > text2.txt 각 줄의 첫 번째 발견 문자열에서만 N이전 내용을 얻습니다."

답변1

또 다른 방법:

$ sed 's/"\([^"]*blah[^"]*"\)/"N\1/g' test.txt 
"N1blah8","na","N8blah4"  
"N2blah5","na","N10blah4"  
"N5blah5","na","1blah234

"정규식은 a , 0개 이상의 비 "문자, 그 다음 a blah, "0개 이상의 비문자를 찾습니다 . 괄호 때문에 이렇게 됩니다.캡처됩니다나중에 호출할 수 있습니다 \1. 따라서 명령은 일치하는 패턴을 자체( )로 바꾸지 \1"N하나를 추가합니다. 이것이 첫 번째가 "괄호 밖에 있는 이유입니다. /g끝에 있는 수정자는 각 줄에서 일치하는 모든 문자열을 대체합니다.

귀하의 sed버전이 이를 지원하는 경우 다음과 같이 단순화할 수 있습니다.

sed -E 's/"([^"]*blah[^"]*")/"N\1/g'

답변2

sed한 줄의 모든 항목을 반복적으로 바꾸려면 마지막 g항목 뒤에 플래그를 추가하십시오 /.

$ sed 's/[^"]*blah/N&/g' test.txt

g플래그를 사용하면 "첫 번째 일치 항목뿐만 아니라 정규식의 겹치지 않는 모든 일치 항목에 대해"가 교체됩니다(내 시스템의 설명서 인용).

"또한 이전에 존재하지 않았던 모든 문자 와 일치하도록 정규식을 약간 변경했습니다 . blah이렇게 하면 대체 항목이 N첫 번째 숫자 앞과 바로 뒤에 삽입됩니다 ".

답변3

임의의 값인 n임의의 문자 뒤에 삽입 하려면 이 작업을 위한 더 나은 도구(예: 또는 등 ) 가 있습니다. 예를 들어 각 일치 필드에 변수를 사용할 수 있습니다 . :nsedawkperlpythonawknSTRINGnPATTERN

awk -vn=2 'BEGIN{FS=OFS=","}{for (i=1; i<=NF; i++){ if ($i ~ /PATTERN/){
h=substr($i,1,n);t=substr($i,n+1,length($i));$i=h "STRING" t}}};1' infile

이는 귀하의 파일이 단순하다고 가정합니다.데이터 세트파일(필드에 쉼표가 포함되지 않음)

답변4

CSV 구문 분석 및 처리는 복잡할 수 있습니다. 다음은 내용에 관계없이 첫 번째와 세 번째 열 앞에 N을 배치하는 Perl oneliner입니다.

1단계: 큰따옴표를 제거합니다.

@F = map { /"(.*)"/ } @F;

2단계, N첫 번째와 세 번째 열 삽입

$F[0,2] =~ s/^/N/;

3단계. 배열을 CSV로 조인

printf qq("%s"\n), join q(","), @F

펄을 실행합니다:

perl -F, -ane '@F = map { /"(.*)"/ } @F; $F[0,2] =~ s/^/N/; printf qq("%s"\n), join q(","), @F' csvfile

편집: 평가 표현식의 보안 위험을 피하는 새로운 방법입니다(terdon에게 감사드립니다).

관련 정보