尝试使用 sed 命令在 test.txt 文件中包含此 var 以删除双引号

Posted

技术标签:

【中文标题】尝试使用 sed 命令在 test.txt 文件中包含此 var 以删除双引号【英文标题】:Attempting to include this var in the test.txt file using sed command to remove double quotes 【发布时间】:2021-10-06 04:37:32 【问题描述】:

我正在尝试使用 sed 命令将这个 var 包含在 test.txt 文件中。

尝试以下脚本:

#!/bin/bash
var="test 'test:test:1.0'"
sudo sed -i '/dependencies /a '"$var"'' test.txt

test.txt

  dependencies         
        implementation 'org.springframework.boot:spring-boot-starter-web'
        implementation 'org.springframework.boot:spring-boot-starter-cache'        
    


group = 'org.gradle'

我正在使用sed 来执行此操作,它正在更新test.txt 文件,但它添加了双引号,

当前脚本结果:

dependencies 
"test 'test:test:1.0'"
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-cache'        
    


group = 'org.gradle'

如果我从变量中删除双引号或sed 命令会导致错误。

错误

sed: can't read 'ch.qos.logback:logback-classic:1.2.2'": No such file or directory

我怎样才能忽略这个双引号?

【问题讨论】:

无法复制,link to repl。请发布脚本执行的declare -p varset -x 的输出。您的变量不是 var="test 'test:test:1.0'",而是var="\"test 'test:test:1.0'\"" 这闻起来很像一个问题,原因与BashFAQ #50 相似——也就是说,误解了句法和文字引号之间的区别。 (如果你只有 syntactic 双引号——正如问题中显示的代码那样——你不会遇到这个问题,正如 KamilCuk 的链接复制器所展示的那样;因此,你必须改为使用文字) . 【参考方案1】:

如果我使用 OP 的 var 分配 ...

var="test 'test:test:1.0'"

...然后OP的sed生成:

  dependencies 
test 'test:test:1.0'
        implementation 'org.springframework.boot:spring-boot-starter-web'
        implementation 'org.springframework.boot:spring-boot-starter-cache'
    

换句话说,我无法重现该问题。

另一方面,如果如 KamilCuk 推测的那样,var 包含双引号,例如:

var="\"test 'test:test:1.0'\""

...然后我可以复制 OP 的输出。

因此,假设双引号实际上是分配给var 的一部分,一个想法是使用参数替换,例如:

var="\"test 'test:test:1.0'\""
sed "/dependencies /a $var//\"/" test.txt

注意:一旦 OP 对结果感到满意,-i 标志可以重新添加到 sed 调用中

这会生成:

  dependencies 
test 'test:test:1.0'
        implementation 'org.springframework.boot:spring-boot-starter-web'
        implementation 'org.springframework.boot:spring-boot-starter-cache'
    

【讨论】:

【参考方案2】:

这可能对你有用(GNU sed):

var="test 'test:test:1.0'"
sed '/dependencies /n;h;G;s/\S.*\n/'"$var"'\n/' file

我也无法重现 OP 的问题。

但是,此解决方案确实将插入的行缩进到相同的深度和正确的位置。

【讨论】:

以上是关于尝试使用 sed 命令在 test.txt 文件中包含此 var 以删除双引号的主要内容,如果未能解决你的问题,请参考以下文章

Sed 常用基本命令

Sed 常用基本命令

mac上执行sed的编辑 -i命令报错sed: 1: "test.txt": undefined label ‘est.txt’或sed: 1: "2a est&qu

sed高级命令

sed替换与别名配置

Linux 命令---- sed