나는 sed
초보자입니다. sed
텍스트 파일의 주석 줄을 삭제하는 데 사용하고 싶습니다 .
내 텍스트 파일 시리즈에서 주석 줄은시작및 #
기호 또는 @
기호(즉, 원래 파일에 그리는 데 사용되었습니다 xmgrace
). 다음과 같은 샘플 파일(이라고 함 sample.txt
) 이 있다고 가정해 보겠습니다 .
# Comment 1 # Another comment # Yet another comment @ More comments @ Still more comments data1 data2 data3
sed
다음을 얻기 위해 내부 수정을 사용하고 싶습니다 .sample.txt
data1 data2 data3
두 버전 모두 " " 와 " " data2
사이에 빈 줄이 있습니다 .data3
sample.txt
에서 영감을 받다이 스택 오버플로 질문, 나는 다음과 같은 일련의 (연속적인) 명령을 생각해 냈습니다.
sed -i 's/#.*$//' sample.txt
sed -i 's/@.*$//' sample.txt
다음 결과 파일이 얻어집니다.
<blank line> <blank line> <blank line> <blank line> <blank line> data1 data2 data3
<blank line>
빈 줄만 있습니다 . (Stack Exchange가 출력 형식을 올바르게 지정하도록 이렇게 작성해야 했습니다.)
위의 문제는 주석 줄이 빈 줄로 바뀔 뿐 완전히 제거되지는 않는다는 것입니다.
(연속) 명령의 또 다른 가능성은 다음과 같습니다.
sed -i 's/#.*$//' sample.txt
sed -i 's/@.*$//' sample.txt
sed -i '/^$/d' sample.txt
나는 그것으로부터 다음과 같은 결과를 얻습니다.
data1 data2 data3
data2
그러나 위의 내용도 " "와 " " 사이의 빈 줄이 data3
유지되지 않기 때문에 잘못된 것입니다. (실수로 빈 줄을 무차별적으로 모두 제거했습니다.) 주석 줄을 제거하는 방법은 무엇입니까?
저는 우분투 리눅스를 사용하고 있습니다. 시간 내 주셔서 감사합니다!
답변1
사용sed 삭제 명령(이는 GNU가 sed
Ubuntu 및 기타 GNU 시스템에 있다고 가정합니다.)
sed -i '/^[@#]/ d' sample.txt
선행 공백 문자를 고려해야 하는 경우:
sed -i '/^\s*[@#]/ d' sample.txt
답변2
grep '^[^@#]' < file.in > file.out
모든 문자로 시작하는 줄을 제공하지만 빈 줄뿐만 아니라 줄도 @
효과적으로 #
제거합니다 #foo
.@foo
grep -v '^[@#]' < file.in > file.out
빈 줄은 유지됩니다. 이전에 공백이 있는 행을 고려하려면 다음을 수행하십시오 @
.#
grep -v '^[[:blank:]]*[@#]' < file.in > file.out
빈 줄을 제거하십시오.
grep '^[[:blank:]]*[^[:blank:]@#]' < file.in > file.out