【问题标题】:Insert spaces around words between parentheses在括号之间的单词周围插入空格
【发布时间】:2017-05-26 16:42:51
【问题描述】:

我有一个名为 sso-shop-med.txt 的文件。

insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by)values('204026601',18, TRUE, current_date,'502675409',current_date,'502675409'); 
insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by)values('502689031',18, TRUE, current_date,'502675409',current_date,'502675409'); 
insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by)values('502683504',18, TRUE, current_date,'502675409',current_date,'502675409'); 
insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by) values ('204009239', 18, TRUE, current_date, '212585704', current_date, '212585704'); 
insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by) values ('204009292', 18, TRUE, current_date, '212585704', current_date, '212585704');

我想在)values( 之间添加一个空格,如下所示:) values (

我已经编写了以下awk 命令,但它不起作用

awk '{gsub(/")values("/, ") values (" ); print}' sso-shop-med.txt

产生的错误:

awk: syntax error in regular expression ")values(" at values("
 source line number 1
 context is
    {gsub(/")values("/, ") values (" >>>  ) <<< 

【问题讨论】:

  • 我很好奇 - 你认为/")values("/ 是什么意思?

标签: bash unix awk gsub


【解决方案1】:

在正则表达式中,您需要转义括号并去掉引号:

$ cat file
last_updated_by)values('204026601',
last_updated_by)values('502689031',
last_updated_by)values('502683504',
last_updated_by) values ('204009239',
last_updated_by) values ('204009292',

$ awk '{gsub(/\)values\(/, ") values (" ); print}' file
last_updated_by) values ('204026601',
last_updated_by) values ('502689031',
last_updated_by) values ('502683504',
last_updated_by) values ('204009239',
last_updated_by) values ('204009292',

【讨论】:

    【解决方案2】:

    我不确定您的 awk 版本,但这似乎可行:

    awk '{gsub("\\)values\\(", "\) values \(") ; print}'
    

    转身

    insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by)values('204026601',18, TRUE, current_date,'502675409',current_date,'502675409');
    insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by)values('502689031',18, TRUE, current_date,'502675409',current_date,'502675409');
    insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by)values('502683504',18, TRUE, current_date,'502675409',current_date,'502675409');
    insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by) values ('204009239', 18, TRUE, current_date, '212585704', current_date, '212585704');
    insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by) values ('204009292', 18, TRUE, current_date, '212585704', current_date, '212585704');
    

    进入:

    insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by) values ('204026601',18, TRUE, current_date,'502675409',current_date,'502675409');
    insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by) values ('502689031',18, TRUE, current_date,'502675409',current_date,'502675409');
    insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by) values ('502683504',18, TRUE, current_date,'502675409',current_date,'502675409');
    insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by) values ('204009239', 18, TRUE, current_date, '212585704', current_date, '212585704');
    insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by) values ('204009292', 18, TRUE, current_date, '212585704', current_date, '212585704');
    

    看起来怎么样?

    【讨论】:

    • 这实际上是错误的答案,因为它在正则表达式上下文中使用字符串,因此迫使 awk 必须解析该字符串两次(一次将其转换为正则表达式),这就是您需要 2 次转义的原因在这个答案中,但the other (correct) awk answer 中只有 1 个。您也不需要在替换字符串中转义括号,
    【解决方案3】:

    您必须使用 \ 转义括号,因为它们是正则表达式中的控制字符。

    话虽如此,虽然我通常像锤子一样使用 awk,但我觉得 sed 在这里更合适:

    sed s/\)values\(/\)\ values\ \(/g sso-shop-med.txt
    

    【讨论】:

    • 不,你不必逃避括号,恰恰相反。转义它们会将它们变成捕获组分隔符 - 只需不要理会它们,它们就会被逐字处理。请记住 - sed 使用 BRE,而不是 ERE。另外,永远不要不引用脚本,正确的 sed 语法应该是 sed 's/)values(/) values (/g' sso-shop-med.txt
    • 什么是 BRE 和 ERE?
    • @JNevill 何时使用 awk 以及何时使用 sed?有什么规定吗?
    • awk 适用于逐行(逐条记录)处理文件并处理记录中的每个字段。我认为 awk 更像是一个简单的数据库查询,例如SELECT substring(field2 FROM 1 FOR 4) FROM &lt;file&gt; WHERE &lt;field1&gt;="somevalue",其中sed 是一个“流编辑器”,因此它只是像流一样吞噬文件,寻找正则表达式命中并在吞噬文件时执行更改。另外,显然我完全搞砸了这个答案(尽管它是偶然的),所以对这个答案持保留态度。 Ed 的评论解释了(那个人知道他的 sed 并且真的知道 awk)。
    • 是的,谢谢你的解释
    【解决方案4】:

    gawk 方法:

    awk '{ gsub(/ *values */," values ",$0) }1' sso-shop-med.txt
    

    输出:

    insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by) values ('204026601',18, TRUE, current_date,'502675409',current_date,'502675409'); 
    insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by) values ('502689031',18, TRUE, current_date,'502675409',current_date,'502675409'); 
    insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by) values ('502683504',18, TRUE, current_date,'502675409',current_date,'502675409'); 
    insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by) values ('204009239', 18, TRUE, current_date, '212585704', current_date, '212585704'); 
    insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by) values ('204009292', 18, TRUE, current_date, '212585704', current_date, '212585704');
    

    • gsub(/ *values */," values ",$0) - 替换/重新排列 values 带有前导/尾随空格的单词(如果values 周围有多余的空格 - 它们将被挤压,如果没有' values 附近任一侧的 t 个空格 - 它们将被添加)

    【讨论】:

      【解决方案5】:

      在 UNIX 中使用 Perl,可以解决这个问题。

      use strict;
      use warnings;
      while(<>){
      print if(s/\((values)\)/\ $1 \/);
      }
      

      输出:

      insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by) values ('204026601',18, TRUE, current_date,'502675409',current_date,'502675409'); 
      insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by) values ('502689031',18, TRUE, current_date,'502675409',current_date,'502675409'); 
      insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by) values ('502683504',18, TRUE, current_date,'502675409',current_date,'502675409'); 
      insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by) values ('204009239', 18, TRUE, current_date, '212585704', current_date, '212585704'); 
      insert into brs.user_shops (user_name, shop_id, is_active, created_date, created_by, last_updated_date, last_updated_by) values ('204009292', 18, TRUE, current_date, '212585704', current_date, '212585704');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多