簡體   English   中英

在bash中的文件中進行幾種替換的最緊湊或最有效的方法是什么

[英]What is the most compact or efficient way of doing several subsitutions in a file in bash

我有一個文件data.base,看起來像:

1234 XXXX
4321 XXXX
9884 ZZZZ
5454 YYYY
4311 YYYY
9882 ZZZZ
9976 ZZZZ

(...這樣的隨機出現直到10000行)

我想創建一個名為data.case的文件,該文件從data.base派生,只是用XXXX,YYYY,ZZZZ替換浮點數。

我不知道在bash或朋友上做這件事的最緊湊/最有效/最快捷的方法是什么。

我通常要做的是:

sed -e "s/XXXX/1.34555/g" data.base > temp1
sed -e "s/YYYY/2.985/g" temp1 > temp2
sed -e "s/ZZZZ/-4.3435/g" temp2 > data.case
rm -fr temp1 temp2

但是當您必須處理3個以上的替換時,我認為這不是最緊湊或最有效的方法。

謝謝

謝謝

使用一個選項在同一sed中執行幾個命令:

sed "s/XXXX/1.34555/g; s/YYYY/2.985/g"; s/ZZZZ/-4.3435/g" data.base > data.case
$ cat sedcommands
s/XXXX/1.34555/g
s/YYYY/2.985/g
s/ZZZZ/-4.3435/g
$ sed -f sedcommands data.base > data.case

您可以在awk中使用關聯數組

awk 'BEGIN{
 # add as needed
 s["XXXX"]=1.3455
 s["YYYY"]=2.985
 s["ZZZZ"]=-4.3435
}
($2 in s) {  print $1,s[$2] }' file

輸出

$ ./shell.sh
1234 1.3455
4321 1.3455
9884 -4.3435
5454 2.985
4311 2.985
9882 -4.3435
9976 -4.3435

sed -e“ s / XXXX / 1.34555 / g; s / YYYY / 2.985 / g; s / ZZZZ / -4.3435 / g”

或將它們放在cmd文件中並列出。

盡管sed可以一次完成多個替換操作, 但是 通用性更高的UNIX方法 (可以與其他命令結合使用)是使用命令管道:

cat data.base | \
   sed -e "s/XXXX/1.34555/g" | \
   sed -e "s/YYYY/2.985/g" | \
   sed -e "s/ZZZZ/-4.3435/g" > data.base

最后的重定向將' unlink ' cat用作輸入的舊數據庫; 但是,您仍然可以使用一個臨時文件,以便可以攔截錯誤情況並且不會在此過程中丟失原始的數據庫。

(使用管道系統時,熟悉tee程序很有用,該程序可將流保存到文件中並繼續傳遞)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM