使用sed(或类似的东西)修改变量的内容

jgy*_*you 6 bash sed

我写了一个BASH文件,其中包含表单的多个嵌入式循环

for P in {'0.10','0.20', [...] '0.90','1.00'}; do 
   for Q in {'0.10','0.20', [...] ,'0.90','1.00'}; do
    [...] 
Run Code Online (Sandbox Code Playgroud)

我将这些变量用作命令行应用程序的参数,并直接在BASH中创建文件名.我想创建重复项,比如$P_REP=0_10用一个下划线替换点而不为每个case写一个显式的switch语句,或者一些硬编码的等价物.我找到的(非优雅的方式)就是为了

  1. 将内容转储P,Q到临时文件.
  2. 使用下划线替换点sed 's/./_/ -i.
  3. 再次读取文件并将其内容加载到新变量.

因此,我想知道是否可以直接在变量的内容上运行sed like命令?

Joh*_*ica 18

你可以直接在bash中进行模式替换:

P_REP=${P/./_}
Q_REP=${Q/./_}
Run Code Online (Sandbox Code Playgroud)

从bash(1)手册页:

参数扩展

${parameter/pattern/string}

模式替换.图案被膨胀,以产生一个模式,就像在路径扩展. 扩展参数,并将模式与其值的最长匹配替换为字符串.如果模式开头/,所有的比赛模式被替换为的字符串.通常只替换第一场比赛.如果pattern#,它必须在参数的扩展值的开头匹配.如果pattern%,它必须在参数的扩展值的末尾匹配.如果是字符串如果为null,则删除模式的匹配,并且可以省略/ following 模式.如果参数是@*,则替换操作依次应用于每个位置参数,并且扩展是结果列表.如果parameter是一个用@或者下标的数组变量*,则替换操作依次应用于数组的每个成员,并且扩展是结果列表.

  • @JGab同样检查`{parameter#word}}和`$ {parameter%word}`,两者都在手册页的相同"参数扩展"部分下.Bash可以做很多很酷的事情,但男人哦男人,它的男人页面是**密集**. (2认同)

Zer*_*eus 11

John Kugelman的答案适用于您的示例,但如果您需要使用实际的sed程序(或其他任意命令)处理变量的内容,您可以这样做:

P_REP=$(sed 's/\./_/' <<< "$P")
Run Code Online (Sandbox Code Playgroud)