Bash 使用sed将字符串插入到文件中

Bash 使用sed将字符串插入到文件中,bash,sed,Bash,Sed,我已将三列复制到一个文件中,但需要更改一列(映射)的格式 输出文件如下所示: ,4.IM-H-506X,2016-01-01 11:07:27-0500 ['LOWERCASETEST7'],JASONTEST7,2015-04-19 00:00:00-0400 "['EPROSP_IWS', '648099_EPROSP_IWS']",4.NDR-IWS-EPRO,2015-04-16 08:04:21-0400 复制数据后,我尝试使用以下命令分隔所有列: sed "s/' *, *

我已将三列复制到一个文件中,但需要更改一列(映射)的格式

输出文件如下所示:

,4.IM-H-506X,2016-01-01 11:07:27-0500
['LOWERCASETEST7'],JASONTEST7,2015-04-19 00:00:00-0400
"['EPROSP_IWS', '648099_EPROSP_IWS']",4.NDR-IWS-EPRO,2015-04-16 08:04:21-0400
复制数据后,我尝试使用以下命令分隔所有列:

    sed "s/' *, *'/' '/g;s/\([^,]*\),\([^,]*\),\(.*\)/update table set cola = \1 where colb = \2 and colc = \3/;s/' '/','/g" tempFile > updatestmt.cql
我得到如下输出:

    update table set cola = where colb = E2Bn9 and colc = 2015-04-29 00:00:00-0500

    update table set cola = ['2C173'] where colb = E2BA8 and colc = 2015-04-29 00:00:00-0500

    update table set cola = "['5A475' where colb =  '2C174'] and colc = E2BA8
在这里,我想以这种格式为我的第一列插入一些内容,如
{'my_refresents':'}

因此,我的预期输出文件如下所示:

{"['EPROSP_IWS', '648099_EPROSP_IWS']":""},4.NDR-IWS-EPRO,2015-04-16 08:04:21-0400
有什么帮助或暗示吗?我对脚本世界非常陌生。

试试这个:

sed "s/^\(\"*\[[^]]*\]\"*\)\(.*\)/{\1:\"\"}\2/" file
带文件:

,4.IM-H-506X,2016-01-01 11:07:27-0500
['LOWERCASETEST7'],JASONTEST7,2015-04-19 00:00:00-0400
"['EPROSP_IWS', '648099_EPROSP_IWS']",4.NDR-IWS-EPRO,2015-04-16 08:04:21-0400
输出:

,4.IM-H-506X,2016-01-01 11:07:27-0500
{['LOWERCASETEST7']:""},JASONTEST7,2015-04-19 00:00:00-0400
{"['EPROSP_IWS', '648099_EPROSP_IWS']":""},4.NDR-IWS-EPRO,2015-04-16 08:04:21-0400
试试这个:

sed "s/^\(\"*\[[^]]*\]\"*\)\(.*\)/{\1:\"\"}\2/" file
带文件:

,4.IM-H-506X,2016-01-01 11:07:27-0500
['LOWERCASETEST7'],JASONTEST7,2015-04-19 00:00:00-0400
"['EPROSP_IWS', '648099_EPROSP_IWS']",4.NDR-IWS-EPRO,2015-04-16 08:04:21-0400
输出:

,4.IM-H-506X,2016-01-01 11:07:27-0500
{['LOWERCASETEST7']:""},JASONTEST7,2015-04-19 00:00:00-0400
{"['EPROSP_IWS', '648099_EPROSP_IWS']":""},4.NDR-IWS-EPRO,2015-04-16 08:04:21-0400

我通常更喜欢使用
gawk
(与
sed
)解析
csv
类型数据,因为它的特性-


我通常更喜欢使用
gawk
(与
sed
)解析
csv
类型数据,因为它的特性-


对于您的3行输入,您只显示一行输出,因此idk如果这符合您对尚未与我们共享的行的要求,但这可能是您想要的:

$ cat tst.awk
BEGIN { FS=OFS="," }
{
    cola = $0
    sub(/(,[^,]+){2}$/,"",cola)
    print "{" cola ":\"\"}", $(NF-1), $NF
}
$
$ awk -f tst.awk file
{:""},4.IM-H-506X,2016-01-01 11:07:27-0500
{['LOWERCASETEST7']:""},JASONTEST7,2015-04-19 00:00:00-0400
{"['EPROSP_IWS', '648099_EPROSP_IWS']":""},4.NDR-IWS-EPRO,2015-04-16 08:04:21-0400
以上是基于你之前的问题-你真的应该接受这个问题的答案,因为它是最清晰、最简单的,而且随着你的需求的变化,它显然是微不足道的

在GNU sed btw中,您只需执行以下操作即可获得上述输出:

$ sed -r 's/(.*)((,[^,]+){2})$/{\1:""}\2/' file
{:""},4.IM-H-506X,2016-01-01 11:07:27-0500
{['LOWERCASETEST7']:""},JASONTEST7,2015-04-19 00:00:00-0400
{"['EPROSP_IWS', '648099_EPROSP_IWS']":""},4.NDR-IWS-EPRO,2015-04-16 08:04:21-0400

但我怀疑这并不是您真正想要做的,如果您想对第一行(其中第一个字段为空)或第二行(第一个字段周围没有双引号)执行一些不同的操作,那么修改它并不像修改awk脚本那样简单。

您只为3行输入显示一行输出,因此idk如果这符合您尚未与我们共享的线路的要求,但这可能是您想要的:

$ cat tst.awk
BEGIN { FS=OFS="," }
{
    cola = $0
    sub(/(,[^,]+){2}$/,"",cola)
    print "{" cola ":\"\"}", $(NF-1), $NF
}
$
$ awk -f tst.awk file
{:""},4.IM-H-506X,2016-01-01 11:07:27-0500
{['LOWERCASETEST7']:""},JASONTEST7,2015-04-19 00:00:00-0400
{"['EPROSP_IWS', '648099_EPROSP_IWS']":""},4.NDR-IWS-EPRO,2015-04-16 08:04:21-0400
以上是基于你之前的问题-你真的应该接受这个问题的答案,因为它是最清晰、最简单的,而且随着你的需求的变化,它显然是微不足道的

在GNU sed btw中,您只需执行以下操作即可获得上述输出:

$ sed -r 's/(.*)((,[^,]+){2})$/{\1:""}\2/' file
{:""},4.IM-H-506X,2016-01-01 11:07:27-0500
{['LOWERCASETEST7']:""},JASONTEST7,2015-04-19 00:00:00-0400
{"['EPROSP_IWS', '648099_EPROSP_IWS']":""},4.NDR-IWS-EPRO,2015-04-16 08:04:21-0400

但我怀疑这并不是您真正想要做的,如果您想对第一行(第一个字段为空)或第二行(第一个字段周围没有双引号)执行一些不同的操作,那么修改它也不像修改awk脚本那么简单。

您能展示一些努力和您已经尝试过的内容吗?先生,我更新了在我的帖子中,通过我的努力,我试图解决我的问题,只向我们展示3行输入中的1行所需的输出,向我们展示一个sed脚本,并说它生成的输出不是它所生成的,然后说你想在问题中使用一种输出格式,但实际上你想在注释中使用不同的输出格式,你让我们很难理解你想要什么,所以我们可以帮助你。您的问题是,至少要简单地显示您发布的示例输入的所有3行的实际预期输出。您能显示一些努力和您已经尝试过的内容吗?先生,我用自己的努力更新了我的帖子。我已经厌倦了解决我的问题,只向我们显示您的3行输入中的1行的预期输出,并向我们显示一个sed脚本并说出它产生它不产生的输出,然后说你想在你的问题中使用一种输出格式,但说你实际上想在评论中使用不同的输出格式,这使我们很难理解你想要什么,以便我们可以帮助你。您的问题至少是简单地显示您发布的示例输入的所有3行的实际预期输出。@user5655807不客气。如果有帮助的话,您可以接受答案。可以改进正则表达式以减少一些反斜杠:
sed-r/^(*\[^]*\]*)(.*)/{\1::}\2/'
@spasic我使用BRE来实现更广泛的兼容性。@Kenavoz-在得到这个输出后,我正试图准备一个更新语句-sed“s/'*,*'/'/g;s/([^,]*),([^,]*),([^,]*),[^,]*),()/update table set cross_refs=\1,其中id=\2,effective_date=\3/;s/'/'/','/g“tempFile>updatestmt.cql我需要根据您的更改更新此语句。你能帮我做这个吗?@user5655807它应该按原样工作(使用
-r
选项),或者按这里所述,在BRE模式下:。@user5655807不客气。如果有帮助的话,您可以接受答案。可以改进正则表达式以减少一些反斜杠:
sed-r/^(*\[^]*\]*)(.*)/{\1::}\2/'
@spasic我使用BRE来实现更广泛的兼容性。@Kenavoz-在得到这个输出后,我正试图准备一个更新语句-sed“s/'*,*'/'/g;s/([^,]*),([^,]*),([^,]*),[^,]*),()/update table set cross_refs=\1,其中id=\2,effective_date=\3/;s/'/'/','/g“tempFile>updatestmt.cql我需要根据您的更改更新此语句。你能帮我做这件事吗?@user5655807它应该按原样工作(使用
-r
选项),或者按这里所述,在BRE模式下工作:。