코드 블록이 포함된 마크다운 파일이 있습니다.
[310]에서: !cat data.md
**File Permission Related Commands**
These commands are used to change permissions of the files
```
72. chmod octal file-name : Changes the permissions of file to octal
chmod 777 /data/test.c : Sets rwx permission for owner , group and others
```
**Network Related Commands**
These commands are used to view and edit network configurations related aspects of the system
```
75. ifconfig -a : Displays all network interface and set ip address
76. ifconfig eth0 : Displays eth0 ethernet port ip address and details
```
**Compression / Archive Related Commands**
These commands are used to compress and decompress files
```
89. tar cf home.tar home : Creates a tar named home.tar containing home/
tar xf file.tar : Extracts the files from file.tar
tar czf file.tar.gz files : Creates a tar with gzip compression
```
시작(삼중 동굴)을 ```bash
편집자가 색상으로 시연할 마크업 셸 스크립트 로 바꾸고 싶습니다 .
나는 대답을 시도했다.
In [327]: !sed 's/^(```)/(```bash)/g' data.md
**File Permission Related Commands**
These commands are used to change permissions of the files
```
72. chmod octal file-name : Changes the permissions of file to octal
chmod 777 /data/test.c : Sets rwx permission for owner , group and others
그러나 개구부는 ```
교체되지 않았습니다.
그러한 작업을 어떻게 수행할 수 있습니까?
답변1
```
다른 모든 줄을 로 바꾸려면 ```bash
awk를 사용하는 것이 더 쉬울 수 있습니다.
awk '$0 == "```" && alt = 1 - alt {$0 = "```bash"}; {print}' < file
바꾸다모든 ```
즉, 다음과 같습니다.
sed 's/^```$/&bash/'
전체 일치 항목인 경우 일치 항목을 명시적으로 캡처할 필요가 없습니다(그런데 ; 로 수행되며 \(...\)
일부 or 구현(...)
에서 지원하는 확장 정규식을 사용하는 경우에만 작동함). 전체 일치 항목이 캡처되기 때문입니다.sed
-E
-r
&
플래그가 필요 하지 않습니다 g
. 이 g
플래그는 다음 항목을 모두 대체합니다.온라인^
, 그러나 여기서는 및 를 사용하여 패턴을 줄의 시작과 끝 부분 에 고정하기 때문에 줄당 한 번만 나타날 수 있습니다 $
.
로 sed
교체하다그 외 모든 것들줄에서 다음과 같이 할 수 있습니다.
sed '
/^```$/ {
s//&bash/;:1
n;//!b1
}'
한 줄:
sed -e '/^```$/ {s//&bash/;:1' -e 'n;//!b1' -e '}'
GNU 구현을 사용하면 sed
이를 다음과 같이 단축할 수 있습니다.
sed '/^```$/{s//&bash/;:1;n;//!b1}'
(그러나 이것은 POSIXly 표준 구문이 아니며, sed
또는 명령 뒤에 코드가 있을 수 없으며 그 앞에는 또는 개행 문자가 있어야 합니다.):
b
;
}
답변2
편집하다
sed 's/^(```)/(```bash)/g'
괄호는 문자 그대로 해석되므로 이 명령은 작동하지 않습니다.
아래와 같이 괄호를 피해야 할 수도 있습니다.
$ sed 's/^\(```\)/```bash/g'
또는 확장 정규식을 활성화할 수 있습니다.
$ sed -E 's/^(```)/```bash/g'
이렇게 하면 괄호를 벗어날 필요가 없습니다.
또는 괄호만 제거하세요.
$ echo '```' | sed 's/^```/```bash/g'
```bash
시작 부분만 일치시키려면 ```
다음과 같은 정규식을 사용할 수 있습니다.
$ sed --null-data -E 's/[`]{3,3}([^`]*)([`]{3,3}){0,1}/```bash\1\2/g'
경고하다: 세 개의 역따옴표 시퀀스 사이에 `(역따옴표)가 있으면 실패합니다.
--null-data
let을 사용하여 sed
입력을 단일 라인(실제로는 널 문자로 구분된 라인)으로 처리한 다음 ``-text-`` 시퀀스를 찾아 ``bash-text-``로 대체합니다.
답변3
나는 다음과 같은 것을 시도 할 것입니다
perl -ple 'if (m/^```$/) { if (--$|) { s/$/bash/ } }' data.md
답변4
다음 명령에서 작은따옴표를 사용해 볼 수 있습니다 sed
.
sed 's/^(```)/(```bash)/g'
이는 Bash에서 기호 해석을 방지하는 데 사용됩니다.
그러나 파일에 따라 다음과 같은 것을 사용하는 것이 더 나을 것입니다.
sed 's/^```/```bash/g'