Como substituir strings de espaço reservado no documento com o conteúdo de um arquivo

2

Eu tenho dois arquivos, A e B .

O arquivo A é uma letra, como abaixo, que contém várias strings de espaço reservado em cada linha, como <@userid> .

<@U39RFF91U> for all the help in this project!

Thanks for your help to enhance the data quality <@U2UNRTLBV> <@U39RFF91U> <@U2UQCN023>!
Thanks for <@U38F4TBQ9> <@U38F5PQ73> <@U38F747CZ> <@U39RT0G07> and <@U2UQ17U20> ’s great work at the New Product!


Successful release! <@U2WHAAU9H> <@U2ML3C551> <@U38F4TBQ9> <@U38F747CZ> <@U39RT0G07> <@U2UQ17U20> <@U38F5PQ73> <@U2N64H7C6>!

Praise <@U2X0APW3Y> for going above and beyond to help with the retail campaign!

O arquivo B é uma tabela de mapeamento, mapeando todos os IDs de usuário para o nome de cada usuário:

U39RFF91U  Person1
U2UNRTLBV  Person2

Gostaria de criar um arquivo final, C , com o conteúdo da carta em A , mas com todos os espaços reservados substituídos pelo conteúdo correspondente da tabela de mapeamento no arquivo B .

Alguma ideia de como fazer isso via shell script no Linux?

    
por Glen31 26.01.2017 / 09:39

5 respostas

4

Você pode transformar os mapeamentos em um script de edição sed da seguinte forma:

$ sed -r 's#^([^[:blank:]]*)[[:blank:]]+(.*)#s/<@>//g#' user_map.txt >script.sed

Dado o exemplo, isso produzirá script.sed com o conteúdo

s/<@U39RFF91U>/Person1/g
s/<@U2UNRTLBV>/Person2/g

Você pode aplicar esse script de edição ao arquivo de texto:

$ sed -f script.sed letter.txt >completed_letter.txt
    
por 26.01.2017 / 09:54
1

Pode ser feito com sed ou usando apenas ferramentas bash.

Solução clássica do bash:

var="$(cat file.txt)";while read -r id name;do var="${var//@$id/$name}";done<mapfile.txt;echo "$var"

Você pode acrescentar >newfile.txt ao último comando para enviar o texto final em um novo arquivo.

Solução de sed com alterações de escrita no mesmo arquivo:

while read -r id name;do sed -i "s/\@$id/$name/g" textfile.txt;done<mapfile.txt

Esta solução pode ser mais lenta se o arquivo de mapeamento / arquivo de texto for muito grande, já que o aplicativo externo sed é chamado para cada entrada encontrada armazenada no arquivo de mapeamento.

Ambas as soluções funcionam bem com sua amostra.

$ cat b.txt
<@U39RFF91U> for all the help in this project!
Thanks for your help to enhance the data quality <@U2UNRTLBV> <@U39RFF91U> <@U2UQCN023>!

$ cat c.txt
U39RFF91U  Person1
U2UNRTLBV  Person2

$ var="$(cat b.txt)";while read -r id name;do var="${var//@$id/$name}";done<c.txt #Batch Solution
$ echo "$var" 
<Person1> for all the help in this project!
Thanks for your help to enhance the data quality <Person2> <Person1> <@U2UQCN023>!

$ while read -r id name;do sed -i "s/\@$id/$name/g" b.txt;done<c.txt #SED solution
$ cat b.txt
<Person1> for all the help in this project!
Thanks for your help to enhance the data quality <Person2> <Person1> <@U2UQCN023>!
    
por 26.01.2017 / 10:38
0

Arquivo B:

U39RFF91U  Person1
U2UNRTLBV  Person2

Arquivo A como notado, por ex. <@U39RFF91U> no texto.

Código de trabalho simples (one-liner):

sed -e "$(sed -E 's_^([^[:space:]]+)[[:space:]]+(.*)$_s/<@>//g_' file_B)" file_A

Essencialmente equivalente:

sed -e "$(sed 's_  *_>/_;s_^_s/<@_;s_$_/g_' file_B)" file_A

(A única diferença é a manipulação de caracteres de tabulação).

Você pode querer revisar o resultado. Parece que você provavelmente perderá algumas vírgulas para que seja um bom inglês.

    
por 26.01.2017 / 13:31
0
sed -r 's#(\S+)\s+(.*)#s/<@>//g#' map | sed -f- data
    
por 28.01.2017 / 10:17
-1

Is it the required output. for checking defind person 1 as upkar. Also user name is not hardcoded it will refer from file B only

Meu script

IFS=$'\n'

for user in $(cat B)

do

userid=$(echo $user | awk -F" " '{print $1}')

username=$(echo $user | awk -F" " '{print $2}')

sed -i 's/<@'$userid'>/'$username'/g' A

done

Arquivo de referência B

U39RFF91U Upkar

U2UNRTLBV Karup

saída

Upkar. por toda a ajuda neste projeto!

Obrigado pela sua ajuda para melhorar a qualidade dos dados Karup Upkar < @ U2UQCN023 >!

Obrigado por < @ U38F4TBQ9 > < @ U38F5PQ73 > < @ U38F747CZ > < @ U39RT0G07 > e < @ U2UQ17U20 > Grande trabalho no Novo Produto!

Lançamento bem sucedido! < @ U2WHAAU9H > < @ U2ML3C551 > < @ U38F4TBQ9 > < @ U38F747CZ > < @ U39RT0G07 > < @ U2UQ17U20 > < @ U38F5PQ73 > < @ U2N64H7C6 >!

Elogio < @ U2X0APW3Y > para ir além para ajudar na campanha de varejo!

    
por 26.01.2017 / 13:22