我想在扫描一系列参数时运行程序 我需要替换特定位置的单词而不匹配任何模式
例如我的输入文件包含以下行:
...
coords xyz
O 0.0 0.0 0.0
H 1.0 1.0 0.0
H 1.0 -1.0 0.0
...
我希望在第66行中替换第3个单词(在此示例中为“-1.0”),并在每次迭代中使用不同的($ i)值
我知道我可以维护original_input文件,进行模式搜索并每次输出到输入文件:
sed "6s/-1.0/$i/" original_input > Input
但我正在寻找一个就地替补,而比赛模式正在不断变化
答案 0 :(得分:1)
我正在解释
“就地替代”为
“在由行号和字号给出的地方替换”
并且“匹配模式”在示例中指的是“-1.0”,您不希望在实现中发生硬编码。
我希望“不匹配任何模式”的要求仅指实际替换,允许在其他地方进行更通用的模式匹配。
我建议的实施方案来解决这个问题:
bash-3.1$ sed -E "4s/(\s*(\S+\s+){2})\S+(\s+|$)/\1$i\3/;" input.txt
给定样本输入的输出(不带“...”),$ i == 5:
coord xyz
O 0.0 0.0 0.0
H 1.0 1.0 0.0
H 1.0 5 0.0
在实施中
“4”是行号,
“2”是单词编号(从0开始计数)。
在输出中 “5”是替代品。
让你的行号得到解决
我通过在正则表达式中要求前面的“nonwhitespace + whitespace”中的正确数字{n}
,即\S+\s+
来完成单词编号。
答案 1 :(得分:0)
对于我的使用,我在一个bash脚本中包含了yunnosch的答案:
#!/bin/bash
# substitute a word in a predefined location disregarding its value
# applied with 4 arguments: ( number of word inside a line, number of line, new value and input text)
# add a 5th argument "-i" to do a in place substitution
echo substituting the \#$1 word in the \#$2 line with $3
declare -i a=$1
let a-=1
sed -E $5 " $2s/(\s*(\S+\s+){$a})\S+(\s+|$)/\1$3\3/;" $4