Text-Processing
如何創建一個 sed 腳本來替換文件中的引號?
所以我在我的數據文件上連續手動使用以下兩個命令,即在第一個命令完成更新文件後觸發第二個命令:
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
選項。