ti-enxame.com

Qual é a maneira correta de inserir tab no sed?

Qual é a maneira correta de inserir tab no sed? Estou inserindo uma linha de cabeçalho em um fluxo usando sed. Provavelmente eu poderia substituir um caractere depois para colocar na guia usando expressão regular, mas existe uma maneira melhor de fazer isso?

Por exemplo, digamos que eu tenho:

some_command | sed '1itextTABtext'

Gostaria que a primeira linha fosse assim (o texto é separado por um caractere de tabulação):

text    text

Tentei substituir TAB no comando acima por "\ t", "\ x09", "" (a própria guia). Eu tentei com e sem aspas duplas e não consigo sedar para inserir tabulação entre o texto.

Estou tentando fazer isso no SLES 9.

18
dabest1

Você pode simplesmente usar o comando sedi corretamente:

some_command | sed '1i\
text    text2'

onde, como espero que seja óbvio, existe uma guia entre 'texto' e 'texto2'. No MacOS X (10.7.2) e, portanto, provavelmente em outras plataformas baseadas em BSD, pude usar:

some_command | sed '1i\
text\ttext2'

e sed traduziu o \t em uma guia.

Se sed não interpretar \t e inserir guias na linha de comando é um problema, crie um script do Shell com um editor e execute esse script.

11
Jonathan Leffler

Supondo que o bash (e talvez outras conchas também funcionem):

some_command | sed $'1itext\ttext'

O Bash processará escapes, como \t, dentro $' ' antes de passar como argumento para sed.

14
Aaron McDaid

O Sed pode fazer isso, mas é estranho:

% printf "1\t2\n3\t4\n" | sed '1i\\
foo bar\\
'
foo bar
1   2
3   4
$

(As barras invertidas duplas são porque estou usando o tcsh como meu Shell; se você usar o bash, use barras invertidas únicas)

O espaço entre foo e bar é uma tabulação, que eu digitei acrescentando-a com CtrlV. Você também precisará anexar as novas linhas dentro de suas aspas simples com um CtrlV.

Provavelmente seria mais simples/mais claro fazer isso com o awk:

$ printf "1\t2\n3\t4\n" | awk 'BEGIN{printf("foo\tbar\n");} {print;}'
3
ghoti

Como a maioria das respostas diz, provavelmente o literal tab char é o melhor.

info sed dizendo "\ t não é portátil.":

... '\CHAR' Matches CHAR, where CHAR is one of '$', '*', '.', '[', '\', or '^'. Note that the only C-like backslash sequences that you can portably assume to be interpreted are '\n' and '\'; in particular '\t' is not portable, and matches a 't' under most implementations of 'sed', rather than a tab character. ...

3
user 1155692

escape do caractere de tabulação:

sed -i '/<setup>/ a \\tmy newly added line' <file_name>

NOTA: acima, temos duas barras invertidas (\), a primeira é para escape () e a próxima é o caractere de tabulação real (\ t)

1
Rajesh Goel

Encontrei uma maneira alternativa de inserir uma guia usando a substituição.

some_command | sed '1s/^/text\ttext\n/'

Eu ainda não sei como fazer isso usando o método insert.

1
dabest1

Para ilustrar o fato, a sintaxe BRE para sed menciona que \t não é portátil, o Git 2.13 (Q2 2017) se livra dele.

Veja commit fba275d (01 abr 2017) por Junio ​​C Hamano (gitster) .
(Mesclado em Junio ​​C Hamano - gitster - in commit 3c833ca , 17 de abril de 2017)

contrib/git-resurrect.sh: não escreva \t para HT em sed scripts

Assim como fizemos em d1d6e5 ("t/t7003: substitui \t com guia literal em sed expression ", 12/08/2010, Git 1.7.2.2), evite escrever" \t "para HT nos scripts sed, que não é portátil.

-   sed -ne 's~^\([^ ]*\) .*\tcheckout: moving from '"$1"' .*~\1~p'     
+   sed -ne 's~^\([^ ]*\) .*     checkout: moving from '"$1"' .*~\1~p'
                            ^^^^
                             |
                        (literal tab)
1
VonC