String

如果字元串包含換行符的C Shell腳本條件

  • May 8, 2014

我不確定如何使用csh字元串匹配語法來表達這一點。我想測試一個 csh 變數是否包含換行符。我基本上在尋找:

if ($mystr !~ <pattern for strings which contain a newline character>)

*編輯:*在我的特殊情況下,我正在嘗試製作這樣的字元串:

1234ABC

像這樣的字元串失敗:

1234ABC
-------
FOOBAR

這些是sed命令的輸出,即sed '1d;$d'. 不確定這是否重要。

我試圖檢測換行符而不是" -------"為了防禦我正在解析的文件格式的變化的原因。(無論如何,我認為我對文件所做的事情並不重要,因為我只是在尋找檢測換行符的通用解決方案。)

if ($mystr:q =~ *'\
'*) echo yes

應該在某些實現和版本中工作csh(例如Debian 上的csh和)。tcsh在其他一些中(例如在 Solaris 10 上發現的那個),您可能會有更好的運氣

set nl = '\
'
if ($mystr:q =~ *$nl:q*) echo yes

大多數人現在已經放棄了嘗試編寫可靠的腳本csh。為什麼要csh在本世紀使用?

此程式碼適用於我(輸出notcsh 6.17.00 (Astron) 2009-07-10 (x86_64-unknown-linux) options wide,nls,dl,al,kan,rh,color,filec

set mystr = '1234ABC\
-------\
FOOBAR'
if ($mystr:q !~ *'\
'*) then
 echo yes
else
 echo no
endif

請注意,如果您這樣做:

set var = `some command`

csh將輸出的每個單詞(空格分隔)儲存在數組some command的幾個元素中。var

和:

set var = "`some command`"

它將每個非空行儲存在數組的元素中。

看起來不能1將整個命令的輸出儲存到變數 in 中(t)csh,因此您唯一的選擇是:

set var = "`some command`" # note that it removes the empty lines
if ($#var == 1)...

1嚴格來說,這是不正確的,可以執行以下操作:

set x = "`some command | paste -d. /dev/null -`"
set var = ""
set nl = '\
'

foreach i ($x:q)
 set i = $i:s/.//:q
 set var = $var:q$i:q$nl:q
end

(當然,它可能不適用於所有csh實現/版本)

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