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 中的值(从:$$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(删除锚点^,添加/g)以删除字符串中任何位置的所有剩余空白。

相关内容