簡體   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