參數我想包括命令參數,內聯註釋,例如:意見之間的BASH
sed -i.bak -r \
# comment 1
-e 'sed_commands' \
# comment 2
-e 'sed_commands' \
# comment 3
-e 'sed_commands' \
/path/to/file
上面的代碼不起作用。在參數行中嵌入註釋有什麼不同的方法嗎?
參數我想包括命令參數,內聯註釋,例如:意見之間的BASH
sed -i.bak -r \
# comment 1
-e 'sed_commands' \
# comment 2
-e 'sed_commands' \
# comment 3
-e 'sed_commands' \
/path/to/file
上面的代碼不起作用。在參數行中嵌入註釋有什麼不同的方法嗎?
如果你真的想評論的論點,可以試試這個:
ls $(
echo '-l' #for the long list
echo '-F' #show file types too
echo '-t' #sort by time
)
這將等同於:
ls -l -F -t
回聲是一個內置的外殼,所以不執行外部命令,所以它速度夠快。但是,無論如何,這是瘋狂的。
或
makeargs() { while read line; do echo ${line//#*/}; done }
ls $(makeargs <<EOF
-l # CDEWDWEls
-F #Dwfwef
EOF
)
我推薦使用較長的文本塊爲sed腳本,即
sed -i.bak '
# comment 1
sed_commands
# comment 2
sed_commands
# comment 3
sed_commands
' /path/to/file
不幸的是,在sed腳本塊嵌入的註釋是不是普遍支持的功能。 sun4版本可以讓你對第一行發表評論,但沒有其他地方。 AIX sed要麼不允許任何註釋,要麼使用除#
以外的其他字符進行註釋。你的結果可能有所不同
我希望這會有所幫助。
您可以援引SED多次,而不是通過所有的參數一個過程:
sed sed_commands | # comment 1
sed sed_commands | # comment 2
sed sed_commands | # comment 3
sed sed_commands # final comment
這顯然更浪費了,但你可以決定三個額外的中美戰略經濟對話進程是可讀性公平交易和可移植性(關於@ shellter關於支持sed命令中的註釋的觀點)。取決於你的情況。
更新:如果您最初打算編輯文件,您也必須進行調整,因爲您的參數暗示了-i
。這種方法需要一個管道。
可怕的想法 - 通過3管道複製日期的努力 – 2011-06-10 16:35:06
公平地說,我應該補充一點:如果文件的大小隻有千字節,這就好了;如果它們是兆字節,變得可疑;如果它們是千兆字節或更大,那麼6個不必要的拷貝(進出三個管道中的每一個)對於舒適度來說太昂貴了 – 2011-06-10 16:47:49
我通常嘗試在shell回答中呈現最少數量的進程,但是我提到這是一個選擇,因爲「可怕」是相對的。1983年,當然。在2011年如我所說,這可能是值得的權衡。你說可讀性不值得可能是幾毫秒和幾十個字節,但在某些情況下,如果臭名昭着的神祕正則表達式可以在腳本中得到澄清,那麼這些碎片可能是值得犧牲的。 – 2011-06-10 16:48:31
沒有辦法做你尋求外殼加上sed將做什麼。我把意見sed
腳本之前,像這樣:
# This is a remarkably straight-forward SED script
# -- When it encounters an end of here-document followed by
# the start of the next here document, it deletes both lines.
# This cuts down vastly on the number of processes which are run.
# -- It also does a substitution for XXXX, because the script which
# put the XXXX in place was quite hard enough without having to
# worry about whether things were escaped enough times or not.
cat >$tmp.3 <<EOF
/^!\$/N
/^!\\ncat <<'!'\$/d
s%version XXXX%version $SOURCEDIR/%
EOF
# This is another entertaining SED script.
# It takes the output from the shell script generated by running the
# first script through the second script and into the shell, and
# converts it back into an NMD file.
# -- It initialises the hold space with [email protected], which is a marker.
# -- For lines which start with the marker, it adds the pattern space
# to the hold space and exchanges the hold and pattern space. It
# then replaces a version number followed by a newline, the marker
# and a version number by the just the new version number, but
# replaces a version number followed by a newline and just the
# marker by just the version number. This replaces the old version
# number with the new one (when there is a new version number).
# The line is printed and deleted.
# -- Note that this code allows for an optional single word after the
# version number. At the moment, the only valid value is 'binary' which
# indicates that the file should not be version stamped by mknmd.
# -- On any line which does not start with the marker, the line is
# copied into the hold space, and if the original hold space
# started with the marker, the line is deleted. Otherwise, of
# course, it is printed.
cat >$tmp.2 <<'EOF'
1{
x
s/^/[email protected]/
x
}
/^[email protected] /{
H
x
s/\([ ]\)[0-9.][0-9.]*\[email protected] \([0-9.]\)/\1\2/
s/\([ ]\)[0-9.][0-9.]*\([ ][ ]*[^ ]*\)\[email protected] \([0-9.][0-9.]*\)/\1\3\2/
s/\([ ][0-9.][0-9.]*\)\[email protected] $/\1/
s/\([ ][0-9.][0-9.]*[ ][ ]*[^ ]*\)\[email protected] $/\1/
p
d
}
/^[email protected]/!{
x
/^[email protected]/d
}
EOF
還有就是大約40線長的文件(標記爲「娛樂」)在另一個sed
腳本,但約一半的行只是簡單的嵌入式shell腳本添加到輸出中。我在13年內沒有更改包含這些東西的shell腳本,因爲(a)它有效,(b)sed
腳本使我無法理解。 (NMD格式包含一個文件名和一個版本號,以空格分開,偶爾還有一個標記字'binary',而不是版本號,以及註釋行和空行。)
您不必瞭解腳本不會 - 但在腳本之前發表評論是我發現的記錄sed腳本的最佳方式。
No.
如果您將\
放在#
之前,它將轉義評論字符,您將不再有評論。
如果您將\
放在#
之後,它將成爲註釋的一部分,您不會再逃脫換行。
缺乏內聯評論是bash的一個限制,你應該更好地適應,而不是嘗試解決一些已經提出的巴洛克建議。
儘管線程相當老,但我確實發現它對於同樣的問題,其他人也會這樣。這是我對這個問題的解決方案:
您需要註釋,這樣如果您在很長時間後查看自己的代碼,那麼在編寫代碼時,您可能會了解到實際做了什麼。我在編寫我的第一個rsync腳本時遇到了同樣的問題,它有很多參數,這些參數也有副作用。
將您的參數按照主題歸在一起,並將它們放入一個變量中,從而得到相應的名稱。這使得識別參數變得容易。這是你的簡短評論。另外,您可以在變量聲明上面添加註釋,以查看如何更改行爲。這是長版評論。
用相應的參數變量調用應用程序。
## Options
# Remove --whole-file for delta transfer
sync_filesystem=" --one-file-system \
--recursive \
--relative \
--whole-file \ " ;
rsync \
${sync_filesystem} \
${way_more_to_come} \
"${SOURCE}" \
"${DESTIN}" \
良好的概述,易於編輯和參數中的評論。它需要更多的努力,但因此質量更高。
我會建議,在某些情況下工作至少另一種方式:
比方說,我有命令:
options=(
--option1
--option2=blah
--option3 option3val
)
foo ${options[@]} /tmp/bar
:
foo --option1 --option2=blah --option3 option3val /tmp/bar`
我可以這樣寫現在讓我們假設我想暫時刪除第二個選項。我可以把它註釋掉:
options=(
--option1
# --option2=blah
--option3 option3val
)
注意,當你需要大量的轉義或引用這種技術可能無法正常工作。我遇到了一些過去的問題,但不幸的是我現在不記得具體的細節:(
但是對於大多數情況,這種技術很好,如果你需要在參數中嵌入空白,正常情況下,將字符串用引號括起來
有趣的想法.. – 2011-06-10 17:11:39
不錯 - 但請注意'do echo $ {line //#* /};只要您的命令不使用'-e'參數,如果它(如'tshark')那麼它會被解釋爲'echo'的參數,並最終從輸出中丟失。然後你可以使用'printf'%s「$ {line //#* /};'而不是 - 但是這樣就排除了使用諸如'-r」$ 1「'這樣的東西來傳遞參數中的文件名,雙引號會在命令中出現(並且不會被shell解釋),從而搞亂文件名。 – sdaau 2014-06-24 00:21:35