Условие скрипта оболочки 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(например, cshи tcshте, что есть в Debian). В некоторых других (например, в Solaris 10) вам может повезти больше с

set nl = '\
'
if ($mystr:q =~ *$nl:q*) echo yes

Большинство людей уже отказались от попыток писать надежные сценарии 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

Обратите внимание, что если вы это сделаете:

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реализациях/версиях)

Связанный контент