Проблемы с Solaris awk

Я пишу сценарий оболочки, и мне нужно убрать FIND ME из чего-то вроде этого:

* *[**FIND ME**](find me)*

и присвоить его массиву. У меня код работал безупречно... пока я не переместил скрипт в Solaris в неглобальную зону. Вот код, который я использовал раньше:

objectArray[$i]=`echo $line | nawk -F '*[**|**]' '{print $2}'`

Теперь печатает:

awk: syntax error near line 1  
awk: bailing out near line 1

Было предложено попробовать ту же команду с nawk, но вместо этого я получаю эту ошибку:

nawk: illegal primary in regular expression `* *[**|**]` at  `*[**|**]`
 input record number 1
 source line number 1

Кроме того, /usr/xpg4/bin/awk не существует.


person pws5068    schedule 05.03.2010    source источник


Ответы (2)


Я думаю, вам нужно четко понимать, что вы хотите получить. Для меня ваша строка awk не «лишает FIND ME out»

echo "* *[**FIND ME**](find me)*" | nawk -F '* *[**|**]' '{print $2}'
[

Поэтому было бы полезно, если бы вы привели несколько примеров ввода/вывода, которые вы ожидаете. Может быть, есть способ сделать то, что вы хотите, с sed?

РЕДАКТИРОВАТЬ:

Из комментариев вы действительно хотите выбрать «НАЙТИ МЕНЯ» из строки, а не удалить ее.

Я предполагаю, что диалект регулярных выражений, принятый этим nawk, отличается от gawk. Так что, возможно, инструмент, который лучше подходит для работы, в порядке.

echo "* *[**FIND ME**](find me)*" | sed -e"s/.*\* \*\[\*\*\(.[^*]*\)\*\*\].*/\1/"
FIND ME
person Douglas Leeder    schedule 05.03.2010
comment
У меня это сработало с awk, я не успешно тестировал вывод nawk. Вот что я хочу: я знаю, что $line=* *[FIND_ME](find_me)* и я хочу назначить objectArray[$i]=FIND_ME Sed, это может сработать, я попробую. - person pws5068; 05.03.2010
comment
Так вы действительно хотите выбрать FIND_ME из таких строк? - person Douglas Leeder; 05.03.2010
comment
Извините, попробуйте это: echo * [FIND_ME](find_me) | awk -F '*[|]' '{print $2}' - person pws5068; 05.03.2010
comment
Да, я хочу выбрать FIND_ME. - person pws5068; 05.03.2010

укажите вашу переменную $line следующим образом: "$line". Если все еще не работает, вы можете сделать это другим способом с помощью nawk, так как вы хотите найти только один экземпляр FIND ME,

$ echo "$line" | nawk '{gsub(/.*\*\[\*\*|\*\*\].*/,"");print}'
FIND ME

или если вы используете bash/ksh в Solaris,

$ line="${line#*\[\*\*}"
$ echo "${line%%\*\*\]*}"
FIND ME
person ghostdog74    schedule 06.03.2010
comment
Решение только для оболочки также должно работать с ksh, который должен быть в Solaris. - person glenn jackman; 06.03.2010
comment
Следует использовать двойные кавычки: line="${line#*[\*\*}"; echo "${line%%\*\*]*}" - person glenn jackman; 06.03.2010
comment
Хм, здесь тоже нужно больше обратной косой черты: line="${line#*\[\\*\\*}"; echo "${line%%\\*\\*\]*}" - person glenn jackman; 06.03.2010
comment
какую оболочку использовал? У меня нет проблем с моей оболочкой bash. Тем не менее, я просто отредактирую его. - person ghostdog74; 06.03.2010