sed 命令不适用于 1 种情况

sed command not working only for 1 scenario

我的 UNIX shell 脚本中有这个 sed 命令行,用于将变量值附加到文件中的现有行。

sed "s/.*/&$OptionalCols/" header_scrubbed_vendor_list.dat \
    >>final_header_scrubbed_vendor_list_${TODAY}.dat

其中 OptionalCols 值是从下方获取的

OptionalCols=`head -1 ${INDIR}Direct_Target_List_*.dat |cut -d'|' -f 19-48`

附加任务对所有人来说都运行良好。但它不适用于以下一个。

Direct_Target_List_*.dat 文件中的第一行是

CID|FirstName|MiddleName|LastName|Suffix|Specialty|AddressLine1|AddressLine2|City|State|ZipCode|Phone|Fax|MENumber|NPINumber|EmailAddress|StateLicenseNumber|GSKBrandPAR|ProfessionalDesignatio|Segment Name |GLP-User Flag|Tanzeum Action Group|Tanzeum See-status|Total_Access_042014to032015|SF_Access_042014to032015|SF_access_012015to032015|Received Samples|Tanzeum Engagers|Tanzeum Writers|NRx_201410to201503|TRx_201410to201503|DM_BRC_dont_use|Email_DMD_Match|CT_Mayo_Match|CT_FPN_Match|CT_IMN_Match|CT_Cons_Match|T/C|Group|Email_Segments|DM_Segments|Alerts_Segments

我收到的错误是

sed: command garbled: s/.*/&ProfessionalDesignatio|Segment Name |GLP-User Flag|Tanzeum Action Group|Tanzeum See-status|Total_Access_042014to032015|SF_Access_042014to032015|SF_access_012015to032015|Received Samples|Tanzeum Engagers|Tanzeum Writers|NRx_201410to201503|TRx_201410to201503|DM_BRC_dont_use|Email_DMD_Match|CT_Mayo_Match|CT_FPN_Match|CT_IMN_Match|CT_Cons_Match|T/C|Group|Email_Segments|DM_Segments|Alerts_Segments/

有人知道为什么会这样吗?

T/C 中的斜杠可能被视为分隔符。看起来有点棘手,所以这里是一个摘录:

...CT_Cons_Match|T/C|Group...

您可以让 sed 使用不同的定界符。选择一个保证不在输入中的。例如:

sed -e 's#regex#replacement#'

您需要为 s 命令使用不同的分隔符。替换中的/被解释为命令结束,后面的C|Group|Email_Segments|...对解释器没有意义。

用你知道不会出现在变量中的东西来分隔你的替换 - 例如! 这里:

sed -e "s!$!$OptionalCols!" infile >>outfile

或者massage变量,在替换的时候用\/替换/

sed -e "s/$/${OptionalCols//\//\\/}/" infile >>outfile

或者,如果难以阅读,则两者结合:

sed -e "s!$!${OptionalCols//!/\!}!" infile >>outfile

(我也把s/.*/&.../改成了s/$/.../来减少工作量)。