2017-12-09 3 views
4

에서 첫 번째 줄을 삭제 SED :내가 폴더에있는 모든 파일의 첫 번째 줄을 제거 할 파일

$ sed -i '' '/^uuid/d' *

은 잘 작동하고 uuid으로 시작하는 모든 줄을 제거합니다. 의 삭제해야 할 첫 번째 줄에 단지 하나가 파일의 일부 이후 UUID로 시작하면

지금 내가 첫 번째 라인을 제거하여 스크립트를 향상시키고 자하는 여러 UUID가 있습니다. 그래서 지금은 다음과 같이 명령을 향상 :

$ sed -i '' '1{/^uuid/d;}' *

가 같은 버전을 이제이 명령은 폴더에 첫 번째 파일 만 작동하고 나는 간단한을 실행하는 경우에도 (단지 첫 번째 줄을 제거)

$ sed -i '' '1d' *

는 여전히 첫 번째 파일에 영향을 미칩니다.

왜 이런가요?

저는 Mac에서 (BSD 버전의 sed를 이해하게되었습니다) 그리고 Brew를 통해 gnu-sed 버전을 설치하려고 시도했습니다. $ brew install gnu-sed --with-default-names, 행운이 없습니다. john1024 나는 -s 옵션을 테스트하지만, 그것을 사용하는 방법을 잘 한에 의해 코멘트 제안으로 :

sed - 20 examples to remove/delete characters from a file 나는 sed - 25 examples to delete a line or pattern in a file을 읽은

, 그리고 sed delete first line in files

UPDATE 1을 봤. 내가 man sed을 검사 할 때 내가 잘못 여기서 뭔가를해야하므로

$ sed -s '1d' ./* sed: illegal option -- s

나는 -s & --seperate 옵션을 찾을 수 있습니다.

업데이트 2 : 좋아, 진행 ... find . -iname '*.yml' -exec sed -i '' -e '1{/uuid/d;}' {} \; 트릭을 수행하지만 난 어떤 도움이나 지침 sed: can't read : No such file or directory

감사를 말하는 오류 메시지가!

: OLA

+4

(리눅스) 나오지 GNU에서이 문제를 해결하기 위해, 하나는 나오지도 별도로 "파일을 고려하는 말은'-s' 옵션을 사용하지 않고 하나의 연속적인 긴 물줄기보다. " BSD sed에 익숙한 사람은 Mac에 비슷한 옵션이 있는지 알려줘야 할 것입니다. – John1024

+3

bsd sed가 -s 스위치를 지원하지 않는다는 공통적 인 비밀이있는 것처럼 보이기 때문에 다른 친구들은 모든 파일을 처리하기 위해 일종의 루프를 사용할 것을 제안합니다 (예 :'find ...... | sed'또는'find .. .exec sed'). 'foldername/*'또는'./*'을 시도해 볼 수도 있고 운이 좋을 수도 있습니다. ... https://forums.freebsd.org/threads/50187/ 및 https://stackoverflow.com/questions/19590980/multiple-replacements-with-one-sed-command –

+0

알겠습니다. './iname '을 찾는다. * .yml'| sed -e '1 {/^uuid/d;}''와'ls * .yml | sed -e '1 {/^uuid/d;}''둘 다 변경되지 않은 디렉토리에있는 파일의 목록 만 생성합니다. – ola

답변

2

sed -i '' '1{/^uuid/d;}' *는 첫 번째 파일을 수정합니다, 줄 번호가 파일에 걸쳐 누적 계산되기 때문에, 그래서 "라인 1"은 첫 번째 파일의 첫 번째 줄의 한 번만 발생합니다. 여러 파일의 첫 줄을 사용하여 뭔가를하려면 파일 당 한 번 sed을 실행해야합니다.

당신은 간단한 for 루프를 사용하는 것을 수행 할 수 있습니다

for f in *; do sed -i '' '1{/^uuid/d;}' "$f"; done 
관련 문제