특정 문자가 포함된 각 줄 앞에 빈 줄을 추가합니다.

특정 문자가 포함된 각 줄 앞에 빈 줄을 추가합니다.

다음 내용이 포함된 Markdown 파일이 많이 있습니다.

* header A  
- item 1  
- item 2
** sub-header A1
** sub-header A2   
* header B  
- item 1  
- item 2  
** sub-header B1
** sub-header B2  
* header C  
- item 1  
- item 2 
** sub-header C1
** sub-header C2  

내용이 다음과 같이 보이도록 변경하고 싶습니다.

* header A  
- item 1  
- item 2
** sub-header A1
** sub-header A2   

* header B  
- item 1  
- item 2  
** sub-header B1
** sub-header B2  

* header C  
- item 1  
- item 2 
** sub-header C1
** sub-header C2  

따라서 기본적으로 스크립트는 단일 파일을 처리하고 별표만 포함된 첫 번째 줄을 제외한 모든 줄 앞에 새 줄을 추가해야 합니다.

또한 두 번째 스크립트가 첫 번째 스크립트와 거의 동일하기를 원하지만 원하는 수만큼 별표가 있는 줄을 일치시키려면 다음과 같이 하십시오.

* header A  
- item 1  
- item 2
** sub-header A1
** sub-header A2   
* header B  
- item 1  
- item 2  
** sub-header B1
** sub-header B2  
* header C  
- item 1  
- item 2 
** sub-header C1
** sub-header C2  

나는 그것을 다음과 같이 바꾸고 싶습니다 :

* header A  
- item 1  
- item 2

** sub-header A1

** sub-header A2
   
* header B  
- item 1  
- item 2  

** sub-header B1

** sub-header B2  

* header C  
- item 1  
- item 2 

** sub-header C1

** sub-header C2  

답변1

그리고 perl:

perl -i -ple 'print "" if $. > 1 && /^\s*\*(\*+|[^*]*)\s*/' your-file

공백 수에 관계없이 시작하는 줄(첫 번째 줄 제외) 앞에 빈 줄을 인쇄한 다음 *1개 이상의 추가 빈 줄을 인쇄 *하거나, *마지막으로 공백이 허용될 때까지 추가 줄을 인쇄하지 않습니다. 따라서 여러 줄로 구성된 줄 또는 *하나만으로 시작하는 줄(선택적으로 공백이 앞에오고 뒤에 아무 것도 올 수 없음)이 있습니다.*

-i파일을 제자리에서 편집하는 데 사용됩니다 .

여러 파일을 처리하는 경우 각 파일을 처리할 때마다 1로 재설정 close ARGV if eof해야 합니다 $..

perl -i -ple '
  print "" if $. > 1 && /^\s*\*(\*+|[^*]*)\s*/;
  close ARGV if eof' ./*.md

답변2

또 다른 Perl 접근 방식:

$ perl -ne 'print /^\*[^*]*$/ && $. > 1 ? "\n$_" : "$_"' file
* header A  
- item 1  
- item 2   

* header B  
- item 1  
- item 2  

* header C  
- item 1  
- item 2 

이것은 첫 번째 줄로 시작하고 첫 번째 줄 이외의 *다른 위치를 포함하지 않는 모든 줄 앞에 개행 문자를 인쇄 합니다.*

답변3

한 가지 가능한 해결책은 awk다음과 같은 작업을 수행하는 것입니다.

 awk '/^*/ { if (FNR!=1) printf "\n"} {print $0}' <input file>

아이디어는 다음으로 시작하는 레코드를 검색하여 *이것이 첫 번째 레코드가 아닌지 확인하는 것입니다. 두 조건이 모두 충족되면 빈 줄이 인쇄됩니다. 그런 다음 입력 줄을 인쇄하십시오.

설명에 제공된 단순화된 버전:

awk 'FNR > 1 && /^*/ {printf "\n"} 1'

*PS 스크립트는 파일의 첫 번째 위치에만 문제가 없습니다.

답변4

편집 스크립트를 사용하여 2행부터 시작하여 ed문자열로 시작하는 각 행에 빈 행을 삽입합니다.*

2,$ g/^* / i \
\
.

이 명령은 g2행부터 마지막 ​​행( )까지의 $모든 행 에 적용되며, i정규식과 일치하는 행 앞에 빈 행을 추가하는 ("삽입") 명령을 적용합니다 ^*. 행 시작 부분에서 0이 아닌 숫자를 ^*\**일치시키려면 OR을 사용하십시오 .^*\{1,\}*

명령 i이 조금 이상해 보이지만,

i

.

(즉, 빈 줄 삽입) 그러나 명령을 통해 실행하기 때문에 마지막 줄을 제외한 모든 줄에서 줄 바꿈을 이스케이프해야 합니다 g.

로 시작하는 줄 찾기를 시작하지 않고 *대신 로 시작하는 줄 찾기를 시작하려면 *명령에서 를 변경하여 2첫 번째 *줄을 건너뛸 수 있습니다(예: ) /^* /+1.

주어진 데이터에 대해 실행하고 몇 가지 추가 명령을 사용하여 수정된 버퍼를 인쇄하고 저장하지 않고 종료합니다.

$ printf '%s\n' '2,$ g/^* / i\' '\' . ,p Q | ed -s file
* header A
- item 1
- item 2

* header B
- item 1
- item 2

* header C
- item 1
- item 2

,p로 변경하면 w수정된 버퍼가 원본 파일에 다시 기록됩니다.


유사한 솔루션은 다음을 사용합니다 sed.

sed -e 1b -e '/^* / i\

' file

...또는 GNU를 사용하세요 sed.

sed -e 1b -e '/^* / i \\' file

지정된 태그로 분기 b(점프)하거나, 태그가 없는 경우 스크립트 끝으로 분기합니다. 여기서는 첫 번째 줄에서 명시적으로 아무 작업도 수행하지 않는 데 사용합니다. 그런 다음 로 시작하는 모든 줄 앞에 빈 줄을 추가하는 삽입 명령을 적용합니다 *.

관련 정보