Substitua a abertura '' 'de pares double' '' por '' 'bash

0

Eu tenho um arquivo de marcação que contém blocos de código como

Em [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

Gostaria de substituir a abertura ''' (tripla cavet) por '''bash para marcar o script de shell que será demonstrado em cores pelo editor.

Eu tentei a resposta.

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

mas a abertura ''' não é substituída.

Como eu poderia realizar essa tarefa?

    
por JawSaw 05.11.2018 / 07:57

4 respostas

2

EDITADO

O comando sed 's/^(''')/('''bash)/g' não funciona porque os parênteses são literalmente interpretados.
Você provavelmente tem que escapar dos parênteses como em

$ sed 's/^\('''\)/'''bash/g'

Como alternativa, você pode ativar expressões regulares estendidas:

$ sed -E  's/^(''')/'''bash/g'

para que os parênteses não precisem ser escapados.

Ou apenas remova os parênteses:

$ echo ''''' | sed 's/^'''/'''bash/g'
'''bash

Para corresponder apenas à abertura ''' , você pode usar um regexp assim:

$ sed --null-data -E 's/[']{3,3}([^']*)([']{3,3}){0,1}/'''bash/g'

Advertência : falha se um '(backtick) for encontrado entre sequências de triplos backticks.

Ele usa --null-data para deixar sed tratar a entrada como uma única linha (na verdade, linhas separadas por caracteres nulos) e, em seguida, procura seqüências de '' '-text-' '' para substituí-las por '' 'bash-text -' ''.

    
por 05.11.2018 / 09:11
4

Para substituir todas as outras linhas ''' por '''bash , provavelmente é mais fácil com o awk:

awk '$0 == "'''" && alt = 1 - alt {$0 = "'''bash"}; {print}' < file

Para substituir todas ''' linha, seria:

sed 's/^'''$/&bash/'

Não é necessário capturar explicitamente a correspondência (que, a propósito, é feita com \(...\) ; (...) só funcionaria depois de ativar expressões regulares estendidas, conforme suportado por algumas sed implementações com -E ou -r ) quando é a partida toda, como todo o jogo é capturado como & de qualquer maneira.

Não há necessidade de um sinalizador g . O g flag é para substituir todas as ocorrências na linha , mas aqui, pode haver apenas uma ocorrência por linha, já que estamos ancorando o padrão no início e no final da linha com ^ e $ .

Com sed , para substituir a linha todos os outros , você poderia fazer:

sed '
  /^'''$/ {
    s//&bash/;:1
    n;//!b1
  }'

Em uma linha:

sed -e '/^'''$/ {s//&bash/;:1' -e 'n;//!b1' -e '}'

Com a implementação GNU de sed , você pode encurtá-lo para:

sed '/^'''$/{s//&bash/;:1;n;//!b1}'

(mas não é a sintaxe sed padrão como POSIXly, você não pode ter nenhum código após os comandos : ou b e precisa haver um ; ou nova linha antes de } ).

    
por 05.11.2018 / 10:12
1

Eu tentaria algo como

 perl -ple 'if (m/^'''$/) { if (--$|) { s/$/bash/ } }' data.md
    
por 05.11.2018 / 09:04
0

Você pode tentar usar aspas simples para o comando sed :

sed 's/^(''')/('''bash)/g'

Isto é usado para evitar a interpretação dos símbolos do bash

Mas com base no seu arquivo, é melhor usar algo como:

sed 's/^'''/'''bash/g'
    
por 05.11.2018 / 08:18