Combinando 2 comandos

4

Eu preciso escrever um script de shell para converter caracteres em um arquivo para minúsculas e substituir caracteres não alfa por _ .

Eu tenho um comando separado para ambos acima. Como dar um arquivo como argumento e fazer as coisas acima, ou seja, a saída terá apenas caracteres minúsculos e não alfa serão substituídos por _ (sublinhado)?

    
por praveen reddy 24.06.2016 / 21:09

3 respostas

8

Usando sed :

sed 's/[^[:alpha:]]/_/g; s/[[:upper:]]/\L&/g' file.txt

Isso é na verdade dois comandos sed separados por ; :

  • s/[^[:alpha:]]/_/g transforma cada caractere não alfabético em _

  • s/[[:upper:]]/\L&/g converte todos os caracteres em maiúsculas em minúsculas

Exemplo:

$ cat file.txt 
fooBAr132323
SpamEgg

$ sed 's/[^[:alpha:]]/_/g; s/[[:upper:]]/\L&/g' file.txt
foobar______
spamegg
    
por heemayl 24.06.2016 / 21:20
1

Abordagem Python para isso:

python -c 'import sys;print "\n".join(["".join([char.lower() if char.isalpha() else "_" for char in line]) for line in sys.stdin])' < input_file.txt

A ideia básica aqui é que dividimos cada linha em caracteres individuais e verificamos se esse caractere é alfabético, depois reconstruímos a linha e finalmente juntamos todas as linhas com nova linha para criar um novo arquivo

Testado com o / etc / passwd:

$ python -c 'import sys;print "\n".join(["".join([char.lower() if char.isalpha() else "_" for char in line]) for line in sys.stdin])' < /etc/passwd | head 

root_x_____root__root__bin_bash_
daemon_x_____daemon__usr_sbin__usr_sbin_nologin_
bin_x_____bin__bin__usr_sbin_nologin_
sys_x_____sys__dev__usr_sbin_nologin_
sync_x_________sync__bin__bin_sync_
games_x______games__usr_games__usr_sbin_nologin_
man_x______man__var_cache_man__usr_sbin_nologin_
lp_x_____lp__var_spool_lpd__usr_sbin_nologin_
mail_x_____mail__var_mail__usr_sbin_nologin_
news_x_____news__var_spool_news__usr_sbin_nologin_
    
por Sergiy Kolodyazhnyy 17.09.2016 / 02:48
0

A outra resposta resolve seu problema imediato, mas uma solução para o caso geral de "combinar dois comandos" continua a ser mencionada. Acredite ou não, o ecossistema Unix foi projetado com isso em mente, e seu shell definitivamente lhe dará uma maneira de fazê-lo.

Se você deseja alimentar um arquivo por meio de um "pipeline" de comandos, use o | (pipe) personagem no bash (presumivelmente, o shell que você está usando).

Algumas outras ferramentas úteis também merecem ser mencionadas: o utilitário "cat" e o ">" operador de redirecionamento.

Vamos supor que seu arquivo seja chamado de input.txt e você queira executá-lo em seu pipeline e chamar o resultado output.txt.

Vamos criar nosso comando peça por peça:

$ cat input.txt

Aqui está o "gato" que eu estava falando. Para todos os efeitos, apenas produz o conteúdo do seu arquivo. Agora, vamos adicionar o primeiro comando em nosso pipeline: a parte "remove non-alphabet". Vou pegar um pedaço do comando heemayl's sed para fazer isso:

$ cat input.txt | sed 's/[^[:alpha:]]/_/g'

Aprender sed e expressões regulares é uma coisa totalmente diferente, então vamos nos contentar com o fato de que esse comando faz o que queremos por enquanto. Adicionando a próxima peça:

$ cat input.txt | sed 's/[^[:alpha:]]/_/g' | tr 'A-Z' 'a-z'

Adotei uma abordagem diferente da heemail para essa, mas faz o mesmo trabalho. Finalmente, vamos colocar a saída no destino que queremos:

$ cat input.txt | sed 's/[^[:alpha:]]/_/g' | tr 'A-Z' 'a-z' > output.txt

Lá vamos nós, nós fizemos isso. Você pode encadear tantos comandos quanto quiser com o | operador, em seguida, colocar a saída em um arquivo usando & gt ;. Esta é uma tarefa muito comum no ambiente de linha de comando, por isso é bom saber o que está acontecendo e se acostumar a usá-lo. ;)

    
por Travis Mick 25.06.2016 / 07:35