sed コマンドに変数を渡す

sed コマンドに変数を渡す

6つの列を持つファイルがあります。

FILEDESCRIPTOR . DESCR00001     FILEDESCRIPTOR  .  DESCRIPTIVENAME
FILEDESCRIPTOR . LSTUPDNAM      FILEDESCRIPTOR  .  LASTUPDATENAME
FILEDESCRIPTOR . LOCAT00001     FILEDESCRIPTOR  .  LOCATION_ID
FILEDESCRIPTOR . RETAILPRC      FILEDESCRIPTOR  .  RETAILPRICE
FILEDESCRIPTOR . LSTUPDTIME     FILEDESCRIPTOR  .  UPDTIMESTAMP
INDUSTRYDIVISION . DESCR00001   INDUSTRYDIVISION  .  DESCRIPTION
INDUSTRYDIVISION . DIVIS00001   INDUSTRYDIVISION  .  DIVISIONCODE
INDUSTRYGROUP . DESCR00001      INDUSTRYGROUP  .  DESCRIPTION
INDUSTRYGROUP . DIVIS00001      INDUSTRYGROUP  .  DIVISION_ID

私がしなければならないのは、最初の3つの列を単一のスペースで区切って処理して単一の列として変数に保存し、次に3つの列を単一のスペースで区切って別の変数に保存することです。次に、sed最初の変数を2番目の変数に置き換えます。

以下のスクリプトを試しましたが、エラーが発生しました。

#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]];
do
        column2="$(echo -e "$line \n" | awk '{print $4, $5, $6}')"
        #column3="$(echo -e "$line \n" | awk '{print $3}')"
        column1="$(echo -e "$line \n" | awk '{print $1, $2, $3}' )"
        #echo " $column1"
        #echo " $column2"
                 sed  "s/${column1}/${column2}/g" IMS_Procedures.txt
done < file

スクリプトが機能しません。私が得るエラーは次のとおりです。

sed: -e expression #1, char 23: unterminated `s' command
sed: -e expression #1, char 23: unterminated `s' command
sed: -e expression #1, char 20: unterminated `s' command
sed: -e expression #1, char 23: unterminated `s' command
sed: -e expression #1, char 23: unterminated `s' command
sed: -e expression #1, char 23: unterminated `s' command
sed: -e expression #1, char 23: unterminated `s' command
sed: -e expression #1, char 22: unterminated `s' command
sed: -e expression #1, char 22: unterminated `s' command
sed: -e expression #1, char 22: unterminated `s' command
sed: -e expression #1, char 23: unterminated `s' command
sed: -e expression #1, char 30: unterminated `s' command

何ができますか?

ベストアンサー1

必要ありませんwhile read
単に入力ファイルを処理できます。

sed 's|[[:blank:]]\{1,\}|/|3;s|.*|s/&/g|' infile

これをsedスクリプトに変換します。

s/FILEDESCRIPTOR . DESCR00001/FILEDESCRIPTOR . DESCRIPTIVENAME/g
s/FILEDESCRIPTOR . LSTUPDNAM/FILEDESCRIPTOR . LASTUPDATENAME/g
s/FILEDESCRIPTOR . LOCAT00001/FILEDESCRIPTOR . LOCATION_ID/g
s/FILEDESCRIPTOR . RETAILPRC/FILEDESCRIPTOR . RETAILPRICE/g
s/FILEDESCRIPTOR . LSTUPDTIME/FILEDESCRIPTOR . UPDTIMESTAMP/g
s/INDUSTRYDIVISION . DESCR00001/INDUSTRYDIVISION . DESCRIPTION/g
s/INDUSTRYDIVISION . DIVIS00001/INDUSTRYDIVISION . DIVISIONCODE/g
s/INDUSTRYGROUP . DESCR00001/INDUSTRYGROUP . DESCRIPTION/g
s/INDUSTRYGROUP . DIVIS00001/INDUSTRYGROUP . DIVISION_ID/g

sed -f-IMS_を処理するために2番目の項目に渡しますProcedures.txt

sed 's|[[:blank:]]\{1,\}|/|3;s|.*|s/&/g|' infile | sed -f- IMS_Procedures.txt

「これはファイルであり、このコマンドは単一のスペースで印刷します」という意味を理解していません。したがって、フィールドがinfile複数のスペースで区切られている場合は、trまず次のものを使用できます。

tr -s '[[:blank:]]' ' ' <infile | sed 's| |/|3;s|.*|s/&/g|' | sed -f- IMS_Procedures.txt

おすすめ記事