일치하는 문자열의 n번째 위치(이 경우 두 번째)에 문자를 추가해야 합니다. 예를 들어 파일에서 문자열 앞과 포함된 문자열 뒤에 text.txt
N을 추가하고 싶습니다."
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
임의의 문자 뒤에 삽입 하려면 이 작업을 위한 더 나은 도구(예: 또는 등 ) 가 있습니다. 예를 들어 각 일치 필드에 변수를 사용할 수 있습니다 . :n
sed
awk
perl
python
awk
n
STRING
n
PATTERN
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에게 감사드립니다).