文字列に改行文字が含まれている場合のCシェルスクリプト条件

文字列に改行文字が含まれている場合のCシェルスクリプト条件

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

いくつかの実装とバージョン(cshDebianなど)で動作する必要があります。他のシステム(Solaris 10など)では、運が良いかもしれません。cshtcsh

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実装/バージョンで動作しない可能性があります)

関連情報