繁体   English   中英

如何在 bash 命令行或脚本中位置更改的文件中替换特定字符?

[英]How can I replace a specific character in a file where it's position changes in bash command line or script?

我有以下文件:

2020-01-27 19:43:57.00 厘米 -8.5 0.2 0 4 81 -2.9 000 0 0 00020 043857.82219 3 1 1 1 1 1

我需要更改的字符“3”是粗体斜体 此字符的值是动态的,但始终是一位数。 我已经使用 sed 尝试了一些东西,但由于在该位置之前添加了额外的字符,我无法想出一种方法来解释字符改变位置。

该字符始终位于行尾的相同位置,但不是从行首开始。 意思是,这个字符左边的内容可能会改变,它可能会更长,但这总是第 11 个字符和从末尾开始的第 6 个数字。 很容易设计一种方法来切割它,或者用尾巴找到它,但我无法设计一种方法来替换它。

需要明确的是,有问题的单个数字字符将始终替换为另一个单个数字字符。

使用 GNU awk

$ cat file
2020-01-27 19:43:57.00 C M -8.5 0.2 0 4 81 -2.9 000 0 0 00020 043857.82219 3 1 1 1 1 1

$ gawk -i inplace -v new=9 'NF {$(NF-5) = new} 1' file

$ cat file
2020-01-27 19:43:57.00 C M -8.5 0.2 0 4 81 -2.9 000 0 0 00020 043857.82219 9 1 1 1 1 1

在哪里:

  • NF {$(NF-5) = new}表示,当该行不为空时,用新值 (9) 替换倒数第 6 个字段。
  • 1表示打印每条记录。
awk '{ $(NF-5) = ($(NF - 5) + 8) % 10; print }'

给定您的输入数据,它会产生;

2020-01-27 19:43:57.00 C M -8.5 0.2 0 4 81 -2.9 000 0 0 00020 043857.82219 1 1 1 1 1 1

3 已经通过 11 到 1 映射——根据你如何分配新值来选择你的毒药,但魔术是$(NF - 5)在最后一列之前(或从末尾开始第六列$(NF - 5)选择第五列。

我会假设您要查找的数字与末尾的距离相同,无论它之前是什么:

rev ~/test.txt | awk '$6=<value to replace>' | rev

你会尝试以下方法吗:

replace="x"     # or whatever you want to replace
sed 's/\(.\)\(.\{10\}\)$/'"$replace"'\2/' file
  • sed 命令的左侧部分\\(.\\)\\(.\\{10\\}\\)$匹配一个字符,后跟十个字符,然后锚定在行尾。
  • 然后用指定的字符替换第一个字符,并重复使用后面的十个字符。

使用 bash shell 这应该是最后一个选项。

rep=10

read -ra var <<< '2020-01-27 19:43:57.00 C M -8.5 0.2 0 4 81 -2.9 000 0 0 00020 043857.82219 3 1 1 1 1 1'
for i in "${!var[@]}"; do printf '%s ' "${var[$i]/${var[-6]}/$rep}"; done

如果它在一个文件中。

rep=10
read -ra var < file.txt

for i in "${!var[@]}"; do printf '%s ' "${var[$i]/${var[-6]}/$rep}"; done

不是最短和最快的方法,但可以做到......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM