【问题标题】:How to add another string in the next line to a specific string on MacOS sed?如何将下一行中的另一个字符串添加到 MacOS sed 上的特定字符串?
【发布时间】:2018-11-04 23:05:17
【问题描述】:

我试图在文件中的'django.contrib.staticfiles', 之后添加一个字符串'rest_framework',,但是当我尝试类似的东西时

sed '/'django.contrib.staticfiles',/a 'rest_framework',' file

我收到一个错误提示

sed: 1: "/'django.contrib.static ...": 命令 a 需要 \ 后跟文本

我也在符号周围使用\ 尝试了相同的命令。

Answer: 安装 gsed 作为基础 MacOS sed 在指定字符串下创建行时无法正常工作。

【问题讨论】:

  • 这绝对不是引号问题。 @Inian 通过指示我使用 gsed 而不是 sed 来解决它。
  • 安装gsed 本身不足以解决您的问题。您必须修复您的命令以保护shell 中的单引号,以便sed 可以看到它们。那部分肯定是重复的。如果您将问题更改为询问有关 MacOS sed 中断正确编写的命令的问题,那么这将是一个明确的非重复。
  • 我从一开始就有这个"/'django.contrib.staticfiles',/a 'rest_framework',",从错误代码中可以看出。 gsed 自己修复了它
  • 还说我在他们周围有`\`测试仍然失败

标签: macos sed


【解决方案1】:

添加 'rest_framework', 之后 'django.contrib.staticfiles',:

$ echo \'django\.contrib\.staticfiles\'\, | 
  sed  "s/\('django.contrib.staticfiles',\)/\1'rest_framework',/g"
'django.contrib.staticfiles','rest_framework',

要获取下一行的'rest_framework',,请在\1 之后添加\n

【讨论】:

    【解决方案2】:

    在彼此之间使用单引号会变得非常混乱。使用双引号保留搜索字符串的文字值。只要您没有搜索/替换包含$ 字符串的字符串,使用双引号就可以了

    sed "/'django.contrib.staticfiles',/a 'rest_framework'," file
    

    显然,MacOS 上 sed 的 FreeBSD 版本仍然会为上述语法抛出错误,并且通过安装 brew install gnu-sed 并使用 gsed 运行命令来使用 GNU sed 工作正常。

    【讨论】:

    • 关于主要问题,另请参阅我的comment
    【解决方案3】:

    关注awk 也可能对您有所帮助。

    awk '{gsub(/\047django.contrib.staticfiles\047\,/,"&\047" ORS "rest_framework\047,")} 1' Input_file
    

    如果将输出保存到 Input_file 在上面的代码中追加> temp_file && mv temp_file Input_file

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      相关资源
      最近更新 更多