繁体   English   中英

在bash中:for循环内$ VARIABLE的“ sed”命令

[英]In bash: a “sed” command of a $VARIABLE inside a for loop

我有一个包含以下行的文件:

s17 line linewidth 1.0
s18 line linewidth 1.0
.
.
.
s28 line linewidth 1.0

我想将这些行替换为:

 s17 line linewidth 2.0
 s18 line linewidth 2.0
 .
 .
 .
 s28 line linewidth 2.0

我已经用bash编写了这段代码:

 #!/bin/bash
 for VARIABLE in {17..28}
 do
   sed 's/s${VARIABLE} line linewidth 1\.0/s${VARIABLE} line linewidth 2\.0/g' ./band-structure-calcite.agr
 done

然后,我通过执行bash change.sh > changed.txt运行代码,但文件changed.txt不包含这些修改。

如果您能帮助我并在我学习bash时向我解释代码答案的语法,我将不胜感激

而不是多次运行sed ,而是在循环中生成sed脚本并运行一次:

for n in {17..28} ; do
    echo "s/s$n line linewidth 1\.0/s$n line linewidth 2.0/g"
done | sed -f- ./band-structure-calcite.agr > changed.txt

用您的数字做一个正则表达式:

allnr=""
for nr in {17..28}
do
    allnr+="${nr}|"
done
# Debug: echo "allnr=${allnr%|}"
sed -r 's/s('"${allnr%|}"') line linewidth 1\.0/s\1 line linewidth 2.0/g' ./band-structure-calcite.agr

在sed命令的地址部分中用正则表达式替换循环:

'/^s\(\(1[7-9]\)\|\(2[0-8]\)\)\s/ s/1\.0$/2.0/' ./band-structure-calcite.agr

正则表达式( /^s\\(\\(1[7-9]\\)\\|\\(2[0-8]\\)\\)\\s/ )匹配以s17,s18,...或s28开头的行,后跟一个空格或制表符,然后sed仅将以下s/1\\.0$/2.0/命令应用于这些行。 其他行不变。 整个文件只读取一次,并且输出中的每条输入线包含一条输出线,这与原始文件不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM