Text-Processing

如何創建一個 sed 腳本來替換文件中的引號?

  • July 30, 2021

所以我在我的數據文件上連續手動使用以下兩個命令,即在第一個命令完成更新文件後觸發第二個命令:

sed -i 's/""""/" " /g' EXPERIMENT-20210729010003.FILE
sed -i 's/"""/" " /g' EXPERIMENT-20210729010003.FILE

我如何在 .sh 腳本中編寫它並將文件名作為參數傳遞給 sh 呼叫?

EXPERIMENT-*.FILE 每天都出現在我的 unix 伺服器上。在任何給定時間點,只能有一個實驗文件,其名稱後附加了唯一的日期時間值。

謝謝!

您可以將兩個單獨的sed命令合併為一個:

sed -i -e 's/""""/" " /g' -e 's/"""/" " /g' file

甚至,

sed -i 's/"\{3,4\}/" " /g' file

(但只是因為之前""""被替換;如果您以相反的順序完成替換,那麼最後一個命令將不等效)。 """

你可以把它變成一個shell腳本,

#!/bin/sh

sed -i -e 's/""""/" " /g' -e 's/"""/" " /g' -- "$@"

…或進入 shell 函式(例如,在您的~.bashrc文件中),

call_sed () {
   sed -i -e 's/""""/" " /g' -e 's/"""/" " /g' -- "$@"
}

命令中的--停止命令行選項處理,並允許您對以破折號開頭的文件名使用腳本或函式。將"$@"擴展為提供給腳本或函式的文件名列表,每個文件名都單獨引用。

您可以像這樣使用腳本或函式:

$ call_sed EXPERIMENT-*.FILE

使用這樣的單個sed命令,您甚至可以將其設為別名,但引用需要小心處理,我建議使用 shell 函式:

alias call_sed='sed -i -e "s/\"\"\"\"/\" \" /g" -e "s/\"\"\"/\" \" /g" --'

要使-i選項(您可能不想總是使用)成為腳本的選項:

#!/bin/sh

unset in_place

if [ "$1" = "-i" ]; then
   in_place=true
   shift
fi

sed ${in_place:+-i} -e 's/""""/" " /g' -e 's/"""/" " /g' -- "$@"

${in_place:+-i}擴展為-i如果$in_place非空。如果給腳本的第一個參數是 ,則該變數將是非空的-i

可以對程式碼的 shell 函式變體進行完全相同的修改,以使 shell 函式成為一個-i選項。

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