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

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

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

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

編輯:在我的特殊情況下,我試圖創建一個像這樣的字串:

1234ABC

像這樣的字串會失敗:

1234ABC
 -------
FOOBAR

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

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

答案1

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

應該可以在某些實作和版本中工作csh(例如Debian 上的cshtcsh)。在其他一些系統中(例如 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`"

它將每個非空行儲存在陣列的元素中。

看起來無法整個命令的輸出儲存到 中的變數中(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實現/版本)

相關內容