linux - 替换特定位置的单词

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

我想在每次迭代中用不同的 ($i) 值替换第 66 行中的第 3 个单词(在此示例中为“-1.0”)

我知道我可以维护一个 original_input 文件,每次进行模式搜索并将其输出到一个输入文件:

sed  "6s/-1.0/$i/" original_input > Input 

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

最佳答案

我在翻译
“就地替换”作为
“替换由行号和字号给出的位置”
并且“匹配模式”在示例案例中指的是“-1.0”,您不希望在实现中进行硬编码。
我希望“不匹配任何模式”的要求仅指实际替换,允许在其他地方进行更通用的模式匹配。

我提出的解决此问题的实现方案:

bash-3.1$ sed -E "4s/(\s*(\S+\s+){2})\S+(\s+|$)/\1$i\3/;" input.txt

给定样本输入(不带“...”)的输出,对于 $i==5:

coords 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+

关于linux - 替换特定位置的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42956709/

相关文章:

linux - 在 shell 脚本的提示中检测并输入输入

linux - 当/dev/null 也给出 "permission denied"时消除 'permission denied'

linux - 如何找到连接usb设备的dev路径?

bash - Terminator/config 不在 .config 文件中

linux sed,同时插入和追加

linux - 在文件的每一行末尾插入 PostgreSQL "select"的结果

python - 如何在 python xmpp 中获取联系人图像 url

linux - 时间选项不起作用

sed - 如何告诉 sed "dot match new line"

linux - 如何在 unix 中删除文件的最后一个字符?