Linux
如何查找第 1 列中最後一次出現的字元串並替換第 3 列中的相應值?
我在一個文件中有三列:
apple1 10109283 20012983 apple1 10983102 10293809 apple1 10293893 2349823049 apple10 109283019 109238901 apple10 192879234 234082034 apple10 234908443 3450983490
我想在第 1 列(在本例中為第 3 行或第 6 行)中找到字元串的最後一次出現,並將第 3 列中的相應數字替換為不同的數字。範例(將第 3 行第 3 列替換為 444444444"
apple1 10109283 20012983 apple1 10983102 10293809 apple1 10293893 444444444 apple10 109283019 109238901 apple10 192879234 234082034 apple10 234908443 3450983490
到目前為止,我嘗試使用 sed 但它沒有用:
sed '$s/apple1*$/444444444/'
sed
無管道的純溶液和tac
對於這樣的情況,逐行方法
sed
無濟於事。更好地一次處理整個緩衝區,就像-z
GNU 的選項sed
一樣(您似乎正在使用 linux 和 GNUsed
,對於攜帶式替代品,請參閱此 Q&A)。現在您可以利用 的貪婪本性
.*
:該模式.*apple1
將匹配所有內容,包括最後一次出現的apple1
,因為所有其他出現都被.*
.然後只需添加下一個欄位(
\s+
用於列分隔符,[0-9]+
用於第二列和另一個\s+
,所有 GNU 擴展正則表達式)並將其包圍,()
以便您可以在替換中重用它作為\1
. 然後在外部添加第三列()
以將其替換為sed -zE 's/(.*\napple1\s+[0-9]+\s+)[0-9]+/\14444444/'
就是這樣。
**非 GNU
sed
使用者的注意事項:**攜帶式解決方案不太方便:sed -E 'H;1h;$!d;x;s/(.*\napple1[[:space:]]+[0-9]+[[:space:]]+)[0-9]+/\14444444/'