使用sed将字符串插入文件

时间:2016-05-07 07:47:32

标签: bash sed

我已将三列复制到文件中,但需要更改一列的格式(地图)。

getSelected()

输出文件如下:

 listView = (SwipeListView) findViewById(R.id.listview);
 loadAdapter = new LoadAdapter(getApplicationContext(),array_list);
    listView.setAdapter(loadAdapter);


    det.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        String str = "";
        str =  loadAdapter.getSelected();
        Toast.makeText(RelationShipChartList.this, str, Toast.LENGTH_SHORT).show();

    }

复制数据后,我尝试使用以下命令分隔所有列:

         echo "copy admin.product (my_references, id, my_date) to 'updateProductStatement.cql';" > copyInputs.cql

我得到这样的输出:

,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

任何帮助或消化?我对脚本世界非常陌生。

3 个答案:

答案 0 :(得分:1)

试试这个:

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

答案 1 :(得分:1)

由于其功能splitting by content,我通常更喜欢使用gawk(与sed相比)来解析csv类型数据。

$ cat test.data
,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 '$1{$1="{"$1":\"\"}"; NF}1' FPAT='("[^"]*")|([^,]*)' OFS=, test.data
,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

答案 2 :(得分:0)

你只为你的3行输入显示一行输出,所以如果这对你想要与我们分享的行完全符合你想要的但是这可能是你想要的:

$ 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

以上内容建立在前一个问题的@LászlóSzilágyi's answer之上 - 你真的应该接受这个问题的答案,因为它是最清晰,最简单的,并且随着你的需求变化而显然是微不足道的。

在GNU sed顺便说一下,你只需输出上面的输出:

$ 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脚本那么微不足道空的或在第一个字段周围没有双引号的第二行。