gpt4 book ai didi

bash - sed:在文件最后一行的位置搜索和替换值

转载 作者:行者123 更新时间:2023-12-03 18:21:38 26 4
gpt4 key购买 nike

我有一个固定宽度的文件,其中 最后一行 需要在某个检查文件的职位 ,如果在该位置找到值,则将其更改为由 指定的另一个值阵列 .输入文件的最后一行如下所示210204154828000999990000056000000072328100000540000000 感兴趣的值位于位置 27、40 和 47。这些位置的值分别为 6、1、4。我正在使用 ARRAY 来检查这些值。如果 ARRAY 的位置与位置的值匹配,则替换为 ARRAY 位置的值。代码看起来像这样

#!/bin/bash

chars=( { A B C D E F G H I )

for num in "${!chars[@]}"
do
sed -i -E '$ s%^(.{26})$num%\1${chars[$num]}%' $1
done
运行它时我没有失败,但我也没有看到它更新最后一行。如果正常工作,预期输出如下: 21020415482800099999000005F000000072328A000005D0000000 执行的命令如下 # ./convert.sh file1.txt我确定我的 sed 有问题,但我就是想不通。任何帮助,将不胜感激。

最佳答案

您不想为每个索引处理文件 10 次。
这是对 awk 的一次调用

tac file | awk '
BEGIN {
split("A B C D E F G H I", chars); chars[0] = "{"
split("27 40 47", idx)
}
FNR == 1 {
line = $0
for (i in idx) {
char = substr(line, idx[i], 1)
repl = chars[char]
line = substr(line, 1, idx[i]-1) repl substr(line, idx[i]+1)
}
$0 = line
}
1
' | tac
反转文件,在第一行操作,然后重新反转文件

要就地保存,请使用 sponge来自 moreutils 包:
tac file | awk '...' | tac | sponge file
或使用临时文件
tmp=$(mktemp)
tac file | awk '...' | tac > "$tmp" && mv "$tmp" file

毫不奇怪,等效的 perl 更简洁
tac file | perl -pe '
BEGIN { @c = qw/ { A B C D E F G H I /; }
$. == 1 or next;
s/{^(.{26})(\d)(.{12})(\d)(.{6})(\d)/$1$c[$2]$3$c[$4]$5$c[$6]/;
' | ...
更具可读性:
tac file | perl -pe '
BEGIN { @c = qw/ { A B C D E F G H I /; }
$. == 1 or next;
s{^(.{26}) (\d) (.{12}) (\d) (.{6}) (\d) }
{ $1 . $c[$2] . $3 . $c[$4] . $5 . $c[$6] }xe;
' | ...

关于bash - sed:在文件最后一行的位置搜索和替换值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66054448/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com