Я пытаюсь использовать sed чтобы заменить '0' словом 'правильное' (я использую echo $? чтобы проверить мой сценарий, и я хочу заменить вывод echo). Проблема в том, что у меня больше текста в выходном файле, а sed заменяет все, а не только "0".

Например:

some command
echo ``date` `>> "file"
echo $? >> "file"
sed -i 's/0/correct/g' /"file"

Какие-нибудь идеи, как я мог заставить это работать?

РЕДАКТИРОВАТЬ 1 13.02.2014

Вывод echo $? это "0" (я знаю, что 0 означает, что все в порядке).

Следующая вещь - это sed -i 's/0/correct/g' /"file" (я только что использовал "", потому что кто-то может неверно истолковать его с конкретным именем).

Вот часть сценария:

echo `date` | cat >> /file.txt
echo $? | cat >> /file.txt
sed -i 's/0/correct/g' /file.txt

-i означает:

   text   Insert text, which has each embedded newline preceded by a back‐slash.

3 ответа3

1

Из вашего фрагмента кода выражение sed выглядит правильно - оно заменит каждый символ «0» на символы «правильный». Если вы хотите , только вывод из echo - команды , которая будет обновлена, вы могли бы поставить sed команду на выходе из echo - сигнала, например:

some command
date >> /file.txt
echo $? | sed 's/0/correct/' >> /file.txt

(обратите внимание, что удаление команд 'echo' и 'cat' не повлияет на вывод)

В контексте вы используете параметр -i это на самом деле вариант командной строки, а не команды sed сценария - это другой раздел на странице man

       -i[SUFFIX], --in-place[=SUFFIX]

          edit files in place (makes backup if extension supplied)

Это означает, что он обновит исходный файл (именно то, что вы хотите в вашем примере).

Однако обратите внимание, что в этом примере проверяемый код выхода является кодом выхода date , а не вашей командой. На самом деле в вашем примере он проверяет код выхода echo , что, как я подозреваю, для вас еще менее полезно.

Более стандартный способ выполнения этой проверки будет выглядеть следующим образом:

some command
result=$?
date >> /file.txt
if [ $result -eq 0 ]
then
  echo "Command finished successfully" >> /file.txt
else
  echo "Command failed with exit code $result" >> /file.txt
fi
0

Если вы хотите заменить только строки, содержащие «0» и ничего больше, используйте:

sed -i 's/^0$/correct/g' file.txt

Где ^ и $ - специальные символы, обозначающие начало и конец строки соответственно.

Потенциальная проблема может быть, если в файле есть какие-либо другие строки, содержащие только «0», а не только $? возвращаемые значения Способ улучшить это - напечатать больше, чем просто $?:

echo RETVAL: $?

А затем позже сопоставьте эту строку:

sed -i 's/^RETVAL: 0$/correct/g' file.txt
0

Если вам действительно не нужно искать выходной файл и вносить в него изменения, тогда было бы проще просто изменить то, что вы пишете в него.

С этим битом сценария, если команда выполнена успешно и возвращает код завершения "0" , тогда "correct" будет записан в ваш файл: "/file.txt" . Если команда возвращает любой другой код выхода, этот код выхода (номер) будет записан в ваш файл.

some command
r=$?
[ $r -eq 0 ] && r="correct"
echo "`date` $r" >> /file.txt

Примечание: при этом дата и ваше сообщение ("правильное") будут выведены в той же строке, которую вы, возможно, хотели. Если вам нужна дата в одной строке, а ваше сообщение - в отдельной строке, измените ее на две эхо-команды, например:

some command
r=$?
[ $r -eq 0 ] && r="correct"
echo `date` >> /file.txt
echo $r >> /file.txt

Есть (по крайней мере) две другие возможности, которые вы можете пытаться реализовать:

Во- первых, если вы хотите записать в файл , если команда успешно (возвращает код завершения "0" В случае успешного завершения в ваш файл будет записано "correct" , но в противном случае, если будет возвращен любой другой код завершения, в ваш файл ничего не будет записано:

some command
[ $? -eq 0 ] && echo "`date` correct" >> /file.txt

Или, если вы хотите идентифицировать все коды выхода, где код выхода "0" равен "правильный", а любой другой код выхода равен "ошибка", то:

some command
r=$?
if [ $r -eq 0 ]; then
    r="correct"
else
    r="error: exit code $r"
fi
echo "`date` $r" >> /file.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .