我在使用sed編輯日誌文件時遇到了一些麻煩。我已經將它構建到一個函數中,該函數應該用另一個函數的輸出替換兩個搜索字符串之間的文本。它幾乎可以正常工作,但將行按順序打印到日誌文件中。對於我的生活,我無法弄清楚爲什麼,以及我在嘗試修復它時做出的大部分調整實際上都有不太理想的結果。Bash/Sed - 多行sed操作打印行無序
我sed的功能:
log_edit(){
"$3" > temp.txt
sed -i -n "/$1/{
:loop
n
/$2/!b loop
x
r temp.txt
G
s/$2/\n\n&/
}
p" "$FILE"
rm temp.txt
}
我使用了「===文字===」分隔爲我的起始和終止字符串一起傳遞給函數,並使用內置的相同功能首先登錄以填充臨時文本文件。
問題發生在與「G」命令相關的地方。它不是將保持模式行附加到字符串的末尾,而是將它附加到字符串的開頭。
原始日誌採樣/所需的輸出:
=== Metech ITAMS Log ===
Metech Recycling
ITAMS Hardware Report
Date: Thu Mar 2 08:01:38 PST 2017
Tech: SP
=== Manufacturer Information ===
# dmidecode 2.12
...
不幸的是,輸出我得到這個樣子的:
=== Manufacturer Information ===
=== Metech ITAMS Log ===
Metech Recycling
ITAMS Hardware Report
Date: Fri Mar 3 09:39:02 PST 2017
Tech: SS
# dmidecode 2.12
...
會有人能夠幫助我理解我在做什麼錯,還是提出修復?這是我的第一個問題,如果需要更多信息,我很樂意提供。提前致謝。
編輯#1:作爲請求調用該函數的代碼片段:
2)
printf "\n"
text_prompt "Please enter Tech initials: "
set_tech_id
text_prompt "Please enter Traveler ID: "
set_travel_id
mv "$FILE" "$TRAVEL_ID $TECH_INITIALS"
FILE="$TRAVEL_ID $TECH_INITIALS"
log_edit "=== Metech ITAMS Log ===" \
"=== Manufacturer Information ===" "print_header"
unset TECH_INITIALS
unset TRAVEL_ID
;;
這是一個菜單功能的一部分,這將是矯枉過正,包括整個事情,要知道,會有幾個不同的開始/停止字符串調用log_edit(儘管所有都遵循=== ===模式),但通常調用不同的函數來填充temp.txt。
編輯2:爲增加透明度,我認爲我應該添加函數被調用$ 3:
print_header(){ #Prints log header.
print_div "Metech ITAMS Log"
printf "Metech Recycling\nITAMS Hardware Report\nDate: $(date)\nTech: %s\n" \
"$TECH_INITIALS"
}
和print_header調用print_div:
print_div(){ #Prints a divider. Required parameter: $1=Text for divider.
printf "\n=== %s ===\n\n" "$1"
}
編輯3:對於問題的清晰,我問題在於$ 2字符串正在寫入temp.txt內容之前的日誌,而不是之後。
最終修改:找到了解決方案。我想我會發佈下面的工作代碼,以防萬一它有助於其他人。我的問題的一大部分是sed如何使用'r'命令的一個誤解。這個解決方案的另一部分來自我接受的答案,但我仍然不明白,那就是替換命令添加反斜槓,這是使其工作的關鍵。我不知道它爲什麼會起作用,但確實如此。
log_edit() { #Works!!
"$3" > temp.txt
sed -i -n '/^'"$1"'$/ {
:loop
n
/^'"$2"'$/!b loop
i\
'"$(sed 's/\\/\\&/g;s/$/\\/' -- "temp.txt")"'
#Blank line terminates i command.
}
p' "$FILE"
rm temp.txt
}
你有沒有完全使用'sed'的心? – eewanco
歡迎來到本網站!請[編輯你的問題](https://stackoverflow.com/posts/42585989/edit)也顯示調用'log_edit'的代碼。謝謝! – cxw
只要一般功能保持不變,我就可以選擇其他選擇。只要我可以使用新測試的結果切換日誌的一部分,並保持格式不變,那麼無論它是sed/awk/perl都不重要。不幸的是,我還不知道AWK或perl的語言。 – makraiz