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/$/.../
来减少工作量)。
我的 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/$/.../
来减少工作量)。