다음 내용이 포함된 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 \
\
.
이 명령은 g
2행부터 마지막 행( )까지의 $
모든 행 에 적용되며, 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
(점프)하거나, 태그가 없는 경우 스크립트 끝으로 분기합니다. 여기서는 첫 번째 줄에서 명시적으로 아무 작업도 수행하지 않는 데 사용합니다. 그런 다음 로 시작하는 모든 줄 앞에 빈 줄을 추가하는 삽입 명령을 적용합니다 *
.