文字列に改行文字が含まれている場合の 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

のいくつかの実装とバージョン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実装/バージョンで動作するとは限りません)

関連情報