문서의 자리 표시자 문자열을 파일의 콘텐츠로 바꾸는 방법

문서의 자리 표시자 문자열을 파일의 콘텐츠로 바꾸는 방법

A두 개의 파일 이 있고 B.

File A은 아래와 같이 문자이며 각 줄에는 여러 자리 표시자 문자열이 포함됩니다(예: ) <@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!

파일은 B모든 사용자 ID를 각 사용자의 이름에 매핑하는 매핑 테이블입니다.

U39RFF91U  Person1
U2UNRTLBV  Person2

Cfile 의 문자 내용을 포함하는 최종 파일을 만들고 싶지만 A모든 자리 표시자는 file 의 매핑 테이블에 있는 해당 내용으로 대체됩니다 B.

Linux에서 쉘 스크립트를 통해 이를 수행하는 방법을 아시나요?

답변1

다음과 같이 매핑을 sed편집 스크립트로 변환할 수 있습니다.

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

예를 들어 보면 다음과 같은 script.sed콘텐츠가 생성됩니다.

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

그런 다음 이 편집 스크립트를 텍스트 파일에 적용할 수 있습니다.

$ sed -f script.sed letter.txt >completed_letter.txt

답변2

이는 sed 또는 bash 도구를 사용하여 수행할 수 있습니다.

클래식 bash 솔루션:

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

>newfile.txt마지막 명령에 추가하여 최종 텍스트를 새 파일로 보낼 수 있습니다 .

동일한 파일에 변경 사항을 쓰기 위한 Sed 솔루션:

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

맵 파일/텍스트 파일이 매우 큰 경우 맵 파일에 저장된 각 항목에 대해 외부 애플리케이션 sed가 호출되므로 이 솔루션의 성능이 느려질 수 있습니다.

두 솔루션 모두 귀하의 샘플에 적합합니다.

$ 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>!

답변3

파일 B:

U39RFF91U  Person1
U2UNRTLBV  Person2

<@U39RFF91U>파일 A는 텍스트에 설명된 대로입니다.


간단한 작업 코드(한 줄):

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

본질적으로 다음과 동일합니다.

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

(유일한 차이점은 탭 문자가 처리되지 않는다는 것입니다.)


결과를 교정하고 싶을 수도 있습니다. 좋은 영어로 간주되기 위해 일부 쉼표가 누락된 것 같습니다.

답변4

sed -r 's#(\S+)\s+(.*)#s/<@\1>/\2/g#' map | sed -f- data

관련 정보