如果字符串包含换行符的 C Shell 脚本条件

2rs*_*2ts 3 string csh

我不确定如何使用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'. 不确定这是否重要。

我试图检测换行符而不是" -------"为了防止我正在解析的文件格式发生变化的原因。(无论如何,我认为我对文件所做的事情并不重要,因为我只是在寻找检测换行符的通用解决方案。)

Sté*_*las 5

if ($mystr:q =~ *'\
'*) echo yes
Run Code Online (Sandbox Code Playgroud)

应该在某些实现和版本中工作csh(例如在 Debian 上找到的cshtcsh)。在其他一些(例如在 Solaris 10 上找到的那个)中,您可能有更好的运气

set nl = '\
'
if ($mystr:q =~ *$nl:q*) echo yes
Run Code Online (Sandbox Code Playgroud)

大多数人现在已经放弃尝试编写可靠的脚本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
Run Code Online (Sandbox Code Playgroud)

请注意,如果您这样做:

set var = `some command`
Run Code Online (Sandbox Code Playgroud)

csh将输出的每个单词(空格分隔)存储some commandvar数组的几个元素中。

和:

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实现/版本)