sed出力の余分なスペースは他のスクリプトに影響します

sed出力の余分なスペースは他のスクリプトに影響します

sed コマンドから余分なスペースを削除する必要がある

以下を使用して、ファイルから$$ENV$$_の後に文字列を取得できます。

sed '/.*$$ENV$$_/!d;s///;s/,.*//;s/^[ \t]*//' file.txt

コマンドの実行:

TAB=$(sed '/.*$$ENV$$_/!d;s///;s/,.*//;s/^[ \t]*//' $file.txt)

この変数($ TAB)は、他のファイルの値をコマンドに置き換えるために別のコマンドを渡します。

cat backup.txt | sed 's%\$\$BTABLE\$\$%"${TAB}"''%g' > $file_bkp1.txt

しかし、私の出力には余分なスペースがあります。

ファイル.txt

CREATE MULTISET TABLE $$ENV$$_TEMP_ESM.EMPASGMTAMPTMPRTRSE , NO FALLBACK , 
    NO BEFORE JOURNAL, 
    NO AFTER JOURNAL, 
    CHECKSUM = DEFAULT, 
    DEFAULT MERGEBLOCKADSRATIO

Sed コマンドは file.txt から値を取得します。

TAB=$(sed '/.*$$ENV$$_/!d;s///;s/,.*//;s/^[ \t]*//' file.txt)

backup.txtの値(from:$ $ BTABLE $ $)を(TEMP_ESM.EMPASGMTAMPTMPRTRSE)に置き換えるコマンド

cat backup.txt | sed 's%\$\$BTABLE\$\$%"${TAB}"''%g' > file_bkp.txt

バックアップ.txt 入力ファイル

CREATE MULTISET TABLE $$ENV$$_$$BTABLE$$_NEW ,NO FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT,
     DEFAULT MERGEBLOCKRATIO
     (
      AR_ID INTEGER NOT NULL,
      AR_TO_RTE_TY_RL_TY_ID VARCHAR(32) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL,
      RTE_BASIS_TY_ID VARCHAR(32) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL,
      RTE_TY_ID VARCHAR(32) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL,
      RTE_ID INTEGER NOT NULL,

末尾に余分なスペースがあるfile_bkp.txtの出力(太字で強調表示されています) 結果ファイル:

マルチセットテーブルの作成$$ENV$$_TEMP_ESM.EMPASGMTAMPTMPRTRSE _NEW、バックアップなし、
     かつては日記がありませんでしたが、
     日記帳がない後、
     チェックサム = デフォルト、
     基本マージブロック比
      AR_ID 整数が空ではありません。
      AR_TO_RTE_TY_RL_TY_ID VARCHAR(32) 文字セット LATIN NOT CASESPECIFIC NOT NULL,
      RTE_BASIS_TY_ID VARCHAR(32) 文字セット LATIN NOT CASESPECIFIC NOT NULL,
      RTE_TY_ID VARCHAR(32) 文字セット LATIN NOT CASESPECIFIC NOT NULL,
      RTE_ID 整数が空ではありません。

答え1

タグのインポート

TAB=$(sed -n 's%.*\$\$ENV\$\$_\(.*\)_NEW.*%\1%p' file.txt)

-n印刷に明示的に指定された行を除くすべての行の印刷をスキップするために使用されます。p代替フラグは、「代替が発生するとこの行を印刷します」を意味します。

また、関心のある行の場合は、部分文字列をで囲み、関心のある正確な部分文字列を除くすべての項目をフィルタリングします\(..\)。その後、置換で「逆参照」を使用して、次の角かっこ内にテキストをインポートできます\1

この値を使用して、以下を置き換えます。

sed 's%\$\$BTABLE\$\$%'"${TAB}"'%g'

これは、引用符を少し調整してコマンドを少し変更したものです。

答え2

わかりました。ここに入力してください。

CREATE MULTISET TABLE $$ENV$$_TEMP_ESM.EMPASGMTAMPTMPRTRSE , NO FALLBACK ,

sedスクリプトはsed '/.*$$ENV$$_/!d;s///;s/,.*//;s/^[ \t]*//'最初にそのエントリ$$ENV$$_/.*$$ENV$$_/!d; s///)を削除し、次にs/,.*//コンマ()の後のすべてのエントリを削除し、すべての先行スペース(s/^[ \t]*//)を削除しますが、コンマの前のスペースは削除しません。したがって、出力はであり、末尾のTEMP_ESM.EMPASGMTAMPTMPRTRSE␣スペース()があります。私はあなたの結果にスペースが続くと思います。

文字列の残りのスペースを削除するには、最後の代替項目をs/[ \t]*//g(remove anchor ^、add)に変更できると思います。/g

関連情報