替换特定位置的单词

时间:2017-03-22 15:52:22

标签: linux bash sed

我想在扫描一系列参数时运行程序 我需要替换特定位置的单词而不匹配任何模式

例如我的输入文件包含以下行:

...  
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 

但我正在寻找一个就地替补,而比赛模式正在不断变化

2 个答案:

答案 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