파일의 시작과 끝에서 빈 줄을 제거하고 싶지만 중간에 비어 있지 않은 줄 사이의 빈 줄은 제거하고 싶지 않습니다. 나는 해결책이 될 것이라고 sed
생각 합니다.awk
원천:
1:
2:
3:line1
4:
5:line2
6:
7:
8:
산출:
1:line1
2:
3:line2
답변1
이 시도,
파일 시작 부분에서 빈 줄을 제거하려면 다음을 수행하십시오.
sed -i '/./,$!d' filename
파일 끝에서 빈 줄을 제거하려면 다음을 수행하십시오.
sed -i -e :a -e '/^\n*$/{$d;N;ba' -e '}' file
파일의 시작과 끝에서 빈 줄을 제거하려면 다음을 수행하십시오.
sed -i -e '/./,$!d' -e :a -e '/^\n*$/{$d;N;ba' -e '}' file
남자들에게서sed,
-e script, --expression=script -> 실행할 명령에 스크립트를 추가합니다.
b label -> label로 분기합니다. label이 생략되면 스크립트 끝으로 분기됩니다.
a -> 줄 뒤에 텍스트를 추가합니다(대체 구문).
$ ->는 마지막 줄과 일치합니다.
n N -> 패턴 공간에 개행 문자를 추가한 후 패턴 공간에 다음 입력 라인을 추가합니다. 더 이상 입력이 없으면 sed는 다른 명령을 처리하지 않고 종료됩니다.
답변2
이 awk 애플릿은 삭제됩니다.시작파일:
awk 'NF {p=1} p'
따라서 tac
이것을 반전 라인과 결합하여 다음을 얻을 수 있습니다.
awk 'NF {p=1} p' file | tac | awk 'NF {p=1} p' | tac
line1
line2
훔침@guillermochamorro의명령 대체 팁:
awk 'NF {p=1} p' <<< "$(< file)"
답변3
파일이 메모리 요구 사항을 충족할 만큼 작은 경우:
$ perl -0777 -pe 's/^\n+|\n\K\n+$//g' ip.txt
line1
line2
-0777
전체 입력 파일 읽기^\n+
문자열 시작 부분부터 하나 이상의 줄 바꿈\n\K
비어 있지 않은 마지막 줄에서 개행 문자 삭제 방지\n+$
문자열 끝에 하나 이상의 줄 바꿈이 있습니다.
답변4
Raku(이전 Perl_6) 사용:
Raku를 사용하여 에서 파일을 읽는 경우 lines
이 trim
기능을 영리하게 사용하면 파일의 시작과 끝에서 빈 줄(예: 공백)을 지울 수 있습니다.
$ raku -e 'lines.join("\n").trim.put;' start_end.txt
lineX
line1
line2
line1
line2
line1
line2
line1
line2
~$
입력 파일은 @schrodigerscatcuriosity에서 사용하는 것과 동일합니다(파일 시작 부분에 두 개의 빈 줄, 파일 끝에 두 개의 빈 줄). 파일의 시작/끝만 정리해야 한다면 trim-leading
과가 trim-trailing
여러분의 친구입니다.
또는 다음은 일부 Raku 기능을 사용하여 @Sundeep의 Perl5 코드를 매우 간단하게 번역한 것입니다.
raku -e 'S:g/ ^\n+ || \n+$ //.put given slurp;' start_end.txt
Perl5에서 Raku로 번역하는 경우: 파일은 -ed이며 slurp
Raku의 비파괴 대체 연산자를 사용합니다.S///
결과 문자열 반환. Raku의 교체 연산자는 가장 긴 토큰 일치(LTM, 개선)를 나타내기 때문에 교체는 Raku의 "첫 번째 일치" 교체 연산자를 통해 ||
수행 됩니다.|
/k
Perl5 및/또는 /K
Raku에 해당하는 명령은 간단 <( ... )>
하며 개별적으로 또는 쌍으로 사용할 수 있습니다. 이러한 연산자는 정규식 엔진에 <(
이전 또는 이후의 일치 항목을 제거하도록 지시합니다 )>
. [그러나 \K
현재 문제에서는 Raku의 해당 기능이 불필요해 보입니다].