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

时间:2016-04-06 20:29:22

标签: python bash variables for-loop sed

我有一个包含这些行的文件:

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时解释代码答案的语法,我将非常感激

3 个答案:

答案 0 :(得分:2)

不是多次运行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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

用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/命令对那些线。其他线路不变。整个文件只读取一次,输出包含每个输入行一个输出行,与原始文件不同。