Linux

sed:反轉模式替換

  • February 10, 2021

我有以下.txt文件:

ABC Corp
1234 7 Oaks Lane
Denton; TX 76509-4321
(682) 543-7890

sed我需要使用命令反向更改郵政編碼的最後 4 位。範例輸出:

ABC Corp
1234 7 Oaks Lane
Denton; TX 76509-1234
(682) 543-7890

它是第三行,在郵政編碼之前有文本,中間有一個破折號。所以第三行破折號之後的所有內容。只有當郵政編碼完全是自己時,我才能做到這一點。我試過了:

sed -i -e 's/([0-9])([0-9])([0-9])([0-9])([0-9])-([0-9])([0-9])([0-9])([0-9])/\9\8\7\6/' test.txt

但這將在反轉後刪除其他所有內容。

您可以首先通過查找該行獨有的模式來簡化您的命令。在下面的範例中,我們假設分號;對於要解析的行是唯一的(至少在您的範例文本中)sed

# capture the last 4 digits of the line and substitute them in reverse order
$ sed '/;/s/\(.\)\(.\)\(.\)\(.\)$/\4\3\2\1/'
ABC Corp
1234 7 Oaks Lane 
Denton; TX 76509-1234
(682) 543-7890

其他答案類似,但使用 Perl:

$ perl -lp -e '/;/ && s/(?<=-)\d{4}/reverse $&/e' <file
ABC Corp
1234 7 Oaks Lane
Denton; TX 76509-1234
(682) 543-7890

這將查找包含;字元的行,並反轉該行上破折號後的四位數字。

數字的反轉是使用 Perlreverse函式完成的。

引用自:https://unix.stackexchange.com/questions/633793