A
とB
の2つのファイルがあります。
ファイル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
の文字のコンテンツを使用して、最終ファイルA
を作成したいのですが、すべてのプレースホルダーがファイルB
。
Linuxでシェルスクリプトを介してそれを行う方法はありますか?
マッピングを次のような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
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>!
sed -r 's#(\S+)\s+(.*)#s/<@\1>/\2/g#' map | sed -f- data
ファイルB:
U39RFF91U Person1
U2UNRTLBV Person2
記載されているようにファイルA、例えば<@U39RFF91U>
本文中。
単純な作業コード(ワンライナー):
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
(唯一の違いは、タブ文字の処理がないことです。)
結果を校正することをお勧めします。良い英語になるためには、おそらくいくつかのコンマが欠けているようです。