2010-11-24 9 views
0

내 데이터 파일에이 문자열을 (dat.txt) =>를 가지고는 나오지

00000 
10101 

나는 1 행, 두 번째와 네 번째 열을 교체하려면, 나는 노력이를 사용하여 고정 폭 파일의 특정 컬럼을 교체 :

$>sed -i "/^1/s/0/1/2" dat.txt 
$>sed -i "/^1/s/0/1/4" dat.txt 

그러나 dat.txt를 다시로드해도 아무 것도 변경되지 않습니다. 내 명령이 틀렸어?

답변

1

첫 번째 행의 행이 이고 행이 인 행을 제외하고는 두 번째 행 (1으로 시작하는 행)을 변경합니다.

24은 두 번째/네 번째 열을 변경하지 않으므로 두 번째/네 번째 발생 패턴을 검색 패턴으로 변경합니다.

는 다음과 같은 성적표를 참조하십시오 :

$ cat dat.txt 
00000 
10101 

$ sed -i "/^1/s/0/1/2" dat.txt ; cat dat.txt 
00000 
10111 

$ sed -i "/^1/s/0/1/4" dat.txt ; cat dat.txt 
00000 
10111 

첫 번째 sed10의 두 번째 발생을 변경할 것을 볼 수 있으며, 그 네 번째 열였다. 두 번째 sed은 네 번째 발생까지 수행하도록 요청한 이후 아무 것도 변경하지 않았으며 거기에 네 개의 0 문자가 없습니다.

당신이 특정 변경하려면, 다음과 같은 성적 증명서에서와 같이 패턴을 캡처 사용할 수 있습니다 대체 텍스트에서 \1 것을 참조하는 데 사용할 수 있도록 패턴을 캡처

$ cat dat.txt 
00000 
10101 

$ sed -i "/^1/s/^\(.\)0/\11/" dat.txt ; cat dat.txt 
00000 
11101 

$ sed -i "/^1/s/^\(...\)0/\11/" dat.txt ; cat dat.txt 
00000 
11111 

괄호를 그 잡힌 텍스트에. 변경하려는 문자 앞에 소수의 문자가 포함되어 있기 때문에 ...을 패턴으로 사용할 수 있습니다. 이 그것을해야

sed -i "/^1/s/^\(.\{84\}\)0/\11/" dat.txt ; cat dat.txt 
1

대체 후 숫자는 특정 문자가 아니라 변경할 인스턴스 번호입니다. 네 번째 인스턴스가 없으므로 두 번째 인스턴스는 효과가 없지만 두 번째 인스턴스는 두 번째 인스턴스를 10111으로 변경해야합니다.

0

: 당신이 (예를 들어) 85 열을 변경하고자한다면, 당신은 아마 같은 뭔가 더 나을 것

sed -i -e '1 s/0/1/2' -e '1 s/0/1/3' dat.txt 

-e 수단은 추가 명령을 사용하므로 하나씩 차례대로 실행합니다. 당신은이를 사용할 수 있습니다 1로 시작하는 모든 행 (^ 수단 '라인의 일치 시작') 변경 : 귀하의 질문에, /^1/ 부분 나오지 수단 명령 s 전에

sed -i '1 s/0/1/2; 1 s/0/1/3' dat.txt 

참고.여기 봐 :

을 특히 섹션을 (줄 번호로 제한)에 대한 링크 포인트와 다음 (패턴) 섹션을 참조하십시오.

2

이 시도 :

sed -i '1{s/./1/2;s/./1/4}' dat.txt 

결과 :

01010 
10101 
관련 문제