2012-07-25 5 views
1

파일에서 문자열을 찾은 다음 해당 문자열을 포함하는 줄을 삭제할 수있는 다음 코드가 있습니다.bash는 파일에서 한 줄을 영구적으로 삭제합니다.

a 
b 
c 

"A"를 삭제 한 후 (문자열 = A) file.txt를가

b c 

대신

될 것입니다 :

echo `sed /$string/d file.txt` > file.txt 

문제는 처음 file.txt를 포함하는 경우이다

b 
c 

아무도 도와 줄 수 있습니까?

답변

6

이것은 백틱 때문입니다. 대신이 작업을 수행합니다 :

sed -i /$string/d file.txt 

주, 당신이 자리에서이 작업을 수행하려는 경우, 당신은 sed이 그것을 읽을 수 있습니다 전에 파일을 파괴 >sed-i를 사용해야합니다.

+1

정규 표현식 chars에서 먼저 $ string을 (를) 이스케이프해서는 안됩니까? – Khaledvic

+0

@Khaledvic : 예. 이 메소드는'$ string'이 쉘이 의미있는 문자를 포함하면 문제가된다. '! '. 기본적으로,'$ string'의 내용이 알려지지 않은 경우,주의 깊게 정규 표현식과 셸의 유효 문자를 모두 이스케이프해야합니다. 그것을 지적 주셔서 감사합니다. – Thor

2

당신은 echo 랩이 필요하지 않습니다, 단순히 시도 :

에코 -n "sed /$string/d file.txt"> file.txt를 나오지

2

당신은 명령의 출력을 인용 할 필요가 in-place 편집 옵션. 그것은 당신의 senario에서 그것을 사용하는 것이 더 적절합니다. 예 : 귀하의 경우의 문제에 대한

sed -i /$string/d file.txt 

`의 출력으로`따옴표로 묶여있다가, 단어 분할은 bash에 의해 이루어집니다. 그리고 개행 문자가 제거됩니다. 이 경우 echo를 사용하려면 다음과 같이하십시오.

echo "`sed /$string/d file.txt`" > file.txt 
1

가 있습니다

sed -i '/a/d' file.txt 
관련 문제