我不确定如何使用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 上的csh
和tcsh
)。在其他一些系统中(例如 Solaris 10 上的系统),您可能会运气更好
set nl = '\
'
if ($mystr:q =~ *$nl:q*) echo yes
csh
到目前为止,大多数人已经放弃尝试编写可靠的脚本。为什么要csh
在本世纪使用?
这段代码对我有用(输出no
)tcsh 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
实现/版本)