我有一个包含这些行的文件:
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时解释代码答案的语法,我将非常感激
答案 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/
命令对那些线。其他线路不变。整个文件只读取一次,输出包含每个输入行一个输出行,与原始文件不同。