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
C
file 의 문자 내용을 포함하는 최종 파일을 만들고 싶지만 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