ドキュメントのプレースホルダ文字列をファイルの内容に置き換える方法

ドキュメントのプレースホルダ文字列をファイルの内容に置き換える方法

A2つのファイルがありますB

FileAは以下のような文字であり、各行には複数のプレースホルダ文字列が含まれます (例: ) <@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は、テキストに記載されているとおりです。


簡単な作業コード(1行):

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

関連情報