Como adicionar um caminho antes do primeiro caractere de cada linha em um arquivo.txt e salvar o mesmo arquivo com essas edições? [duplicado]

1

Eu tenho um arquivo com algumas linhas como:

account_1
account_2 
account_3

Eu tenho que adicionar um caminho como /home/info/ antes de cada linha e salvar o mesmo arquivo com as atualizações como esta:

/home/info/account_1
/home/info/account_2 
/home/info/account_3

Como posso lidar com isso no AIX?

    
por Tarek Sayed 06.11.2018 / 11:27

3 respostas

4

Para adicionar qualquer string ao início de cada linha em um arquivo, você pode usar

sed -i 's#^#/home/info/#' file

Isso faria uma edição no local do arquivo chamado file e inseriria a string /home/info/ no início de cada linha.

No FreeBSD ou derivados (como macOS), você teria que usar -i '' em vez de -i (veja também " Como posso obter portabilidade com sed -i (edição no local)? ").

Os # são usados como delimitadores da expressão sed aqui, pois o texto de substituição contém / . Nós também poderíamos ter escrito

sed -i 's/^/\/home\/info\//' file

mas isso é um pouco difícil de ler e escrever (ver Wikipedia: Síndrome do palito inclinado ).

Como sempre, execute sed sem a opção -i primeiro para ter certeza de que ele faz a coisa correta.

Para sistemas em que sed não suporta -i para edição no local, você precisará gravar o resultado em um arquivo temporário e substituir o original por esse arquivo:

sed 's#^#/home/info/#' <file >file.new &&
mv file.new file

Isso substituiria o arquivo original pelo arquivo modificado se o comando sed fosse bem-sucedido.

Se você precisar manter os metadados, como permissões de propriedade e de arquivo, faça como

cp file file.tmp &&
sed 's#^#/home/info/#' <file.tmp >file &&
rm file.tmp
    
por 06.11.2018 / 11:34
2

A resposta de Kusalananda com sed é boa; Vou propor uma alternativa - uma edição no local com ed , que é instalada por padrão no AIX:

ed -s input <<< $'1,$s!^!/home/info/!\nw\nq'

ou mais concisa, usando , como um atalho para o intervalo de endereços 1,$ de todo o arquivo:

ed -s input <<< $',s!^!/home/info/!\nw\nq'

A idéia é a mesma de sed - use o comando s earch e replace com um delimitador que não está presente no texto de busca ou substituição, para evitar o LTS; em vez de # , escolhi arbitrariamente ! . Os comandos restantes são separados por novas linhas e instruem ed to w a reencaminhar o ficheiro para q uit out. Todos os comandos são enviados como string here para o comando ed . Eu usei o -s flag para colocar ed em "modo de script", onde ele acalma a saída (bytes lidos e escritos, aqui).

Para usar strings aqui, você precisará usar ksh93 , também presente nos sistemas AIX de estoque.

Como alternativa a here-strings, use printf :

printf '1,$s!^!/home/info/!
w
q
' | ed -s input

Onde eu quebrei os comandos ed até várias linhas para legibilidade, ou tudo em uma linha:

printf '1,$s!^!/home/info/!\nw\nq\n' | ed -s input

Como alternativa ao printf, um documento aqui também funciona:

ed -s input << 'EOF'
1,$s!^!/home/info/!
w
q
EOF
    
por 06.11.2018 / 14:47
-1

outra alternativa com awk

awk -i inplace  '{ print  "/home/info/"  $1 }'  file

/home/info/account_1
  • -i inplace
    A extensão inplace emula a opção -i do sed do GNU, que realiza a edição “in-loco” de cada arquivo de entrada. Ele usa o arquivo include inplace.awk incluído para chamar a extensão corretamente:

  • print "/home/info/" concatena o primeiro campo.

  • $ 1 representa o primeiro campo do arquivo.

por 06.11.2018 / 17:05