我不确定如何使用csh
字符串匹配语法来表达这一点。我想测试一个 csh 变量是否包含换行符。我基本上在寻找:
if ($mystr !~ <pattern for strings which contain a newline character>)
Run Code Online (Sandbox Code Playgroud)
编辑:在我的特殊情况下,我正在尝试制作这样的字符串:
1234ABC
Run Code Online (Sandbox Code Playgroud)
像这样的字符串失败:
1234ABC
-------
FOOBAR
Run Code Online (Sandbox Code Playgroud)
这些是sed
命令的输出,即sed '1d;$d'
. 不确定这是否重要。
我试图检测换行符而不是" -------"
为了防止我正在解析的文件格式发生变化的原因。(无论如何,我认为我对文件所做的事情并不重要,因为我只是在寻找检测换行符的通用解决方案。)
if ($mystr:q =~ *'\
'*) echo yes
Run Code Online (Sandbox Code Playgroud)
应该在某些实现和版本中工作csh
(例如在 Debian 上找到的csh
和tcsh
)。在其他一些(例如在 Solaris 10 上找到的那个)中,您可能有更好的运气
set nl = '\
'
if ($mystr:q =~ *$nl:q*) echo yes
Run Code Online (Sandbox Code Playgroud)
大多数人现在已经放弃尝试编写可靠的脚本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
Run Code Online (Sandbox Code Playgroud)
请注意,如果您这样做:
set var = `some command`
Run Code Online (Sandbox Code Playgroud)
csh
将输出的每个单词(空格分隔)存储some command
在var
数组的几个元素中。
和:
set var = "`some command`"
Run Code Online (Sandbox Code Playgroud)
它将每个非空行存储在数组的元素中。
看起来不能1将整个命令的输出存储到 中的变量中(t)csh
,因此您唯一的选择是:
set var = "`some command`" # note that it removes the empty lines
if ($#var == 1)...
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
(当然,它可能不适用于所有csh
实现/版本)