[英]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.