Bash

如何將具有兩列的文件讀入腳本,以便每行讀取為兩個變數

  • July 10, 2019

我有一個文件,它有兩列這樣的。

cat test.txt

100 2007
FFF 1993
7E7 1994
4BB 1995

我需要將每一行輸入到腳本中,並將兩列分配為單獨的變數,以便我可以通過不同的循環執行它們,然後移至下一行。

我有一長串文件,我需要為每一對執行查找和替換功能。我正在將集合轉換為我已經繪製好的年份。

我的腳本看起來像這樣。

SET=$1
YEAR=$2

for i in `ls` ; do
sed -i "" 's/"$1"/"$2"/g' $i;
done

我不知道如何讓 test.txt 用新行循環腳本。

您可以使用read基於空格(看起來像您的文件使用的)拆分行。像這樣的東西:

while read set year; do
   DoStuffWith "$set" "$year"
done <test.txt

其他注意事項:

  • 請注意,我在上面的範例中使用了小寫的變數名。有一堆全大寫的名稱具有特殊含義,避免與它們發生衝突的最安全方法是堅持使用小寫或混合大小寫的變數(除非您想要特殊含義)。
  • 不要迭代 的輸出ls,只需使用for i in *; do. 並雙引號引用$i以避免在某些情況下出現奇怪的解析。

除非您不需要這樣做,sed否則如果您使用sed -i "" 'whatever' *.

  • sed命令中,您似乎正在嘗試在單引號字元串中使用變數替換和雙引號,但這不起作用。如果您不希望雙引號成為搜尋/替換字元串的一部分,請改用:
sed -i "" "s/$set/$year/g" *

如果您確實想要在搜尋和替換字元串中使用文字雙引號,請將它們轉義:

sed -i "" "s/\"$set\"/\"$year\"/g" *
  • 看起來您正計劃遍歷文件,並且對於每一行循環替換該字元串的每個文件。為什麼不一次執行完成所有替換?也就是說,與其sed使用 command執行s/100/2007/g,然後再次使用s/FFF/1993/g,然後再執行一次……為什麼不使用 command 執行一次s/100/2007/g; s/FFF/1993/g; s/7E7/1994/g; ...呢?

您需要sed在循環中建構命令,如下所示:

sedCommand=""
while read set year; do
   sedCommand+="s/$set/$year/g; "
done <test.txt

sed -i "" "$sedCommand" *
  • 最後,像這樣的全域替換讓我擔心。你確定“100”不會出現在任何文件中,除了那些應該被“2007”替換的實例嗎?這包括 test.txt 文件嗎?

你有所有這些文件的備份嗎?在你不想失去任何東西之前,你真的應該這樣做。

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