如果字符串包含换行符的 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实现/版本)

相关内容