\b
или \s
и ^
\b
для поиска границ слов, и ^
для поиска начала строки:
sed -i '/^test\b/d' file.txt
Вместо \b
используйте \s
для поиска символа пробела, если ваши колонки разделены пробелами.
sed
? Да.
Далее следует краткое упоминание (большинства) других "обычных подозреваемых" в обработке текста командной строки:
В качестве альтернативы, иногда я использую grep
для аналогичных целей, особенно если я просто хочу поработать с копией файла, перенаправить вывод или передать вывод другой утилите:
grep -v '^test\b' file.txt
или используя -w
подбор слов:
grep -vw '^test' file.txt
Оба вывода:
ID VALUE
testing value_2
first value_3
second value_4
Есть много других более мощных опций, доступных после перехода на скриптовые языки более высокого уровня. awk
является хорошим промежуточным вариантом и хорошо справляется с табличным вводом, например, таким как:
awk 'NR > 1 && $1 != "test" { print $1,":",$2 }' test.txt
NR > 1
пропускает первую (заголовочную) строку, а $1 != "test"
использует простое сравнение строк вместо регекса (хотя вместо него можно использовать !/^test /
). Блок { print ... }
выводит первый и второй столбцы, разделенные двоеточием (произвольно, просто чтобы показать вам немного возможного):
testing : value_2
first : value_3
second : value_4
так что awk
- хороший инструмент для изучения. После этого вы попадаете в сферу полноценных языков программирования, таких как Perl, Python и др. Их можно использовать как для написания одной фразы, так и для создания гигантских программных комплексов.
Попробуйте следующую структуру:
$ cat > file.sh << "EOF"
echo Hello World, done
read num1
echo please enter the second number
read num2
echo Sum of $num1 and $num2 is `expr $num1 + $num2`
EOF
Linux с нуля использует этот метод для всего, от сценариев до создания файлов. Если done
переопределяет EOF
, рассмотрите возможность экранирования, как предлагает Спархок.
Самый простой способ создать текстовый файл (, который является сценарием оболочки )из интерактивной оболочки в терминале с использованием перенаправления, просто сделать
$ cat >filename
... а затем вставьте любой текст, который вы хотите, или начните вводить (используйте >>
вместо >
до добавьте к уже существующему файлу ). Когда закончите, нажмите Ctrl+D .
В качестве дополнительного бонуса оболочка не будет интерпретировать то, что вы вставляете или вводите в текстовый файл таким образом. Если бы вы использовали echo
для вставки отдельных строк или документ здесь -для вставки нескольких строк, вы должны были бы помнить о защите текста с помощью правильного использования кавычек, чтобы предотвратить расширение переменных, escape-последовательностей и т. д. в оболочке в содержание документа.
Чтобы создать скрипт из скрипта, используйте цитируемый здесь -документ
cat <<'END_SCRIPT' >filename
script
goes
here
END_SCRIPT
Проблема, с которой вы столкнулись в своем вопросе, заключается в том, что при простом добавлении echo
к строкам остальная часть строки по-прежнему интерпретируется оболочкой, если вы не примете дополнительные меры предосторожности.
tldr; оболочка интерпретирует символы перед добавлением в файл.
echo echo Hello World, "done" >> file.sh
Оболочка интерпретирует "
, удаляя их из стандарта из echo
. Следовательно, вам нужно либо убежать от них,
echo echo Hello World, \"done\" >> file.sh
или, проще говоря, заключить все это в '
.
echo 'echo Hello World, "done"' >> file.sh`
Сказав это, я не уверен, что вы имеете в виду под
to make sure that when I run the file, the terminal doesn't consider the keyword "done"
done
после echo
ничего не значит. Новый скрипт просто напечатает литерал done
. Просто проверьте это!
Аналогично, для
echo $num1 plus $num2 is `expr $num1 + $num2`
оболочка интерпретирует переменные иexpr
перед добавляет к файлу. Опять же, просто заключите все в '
.
echo 'echo $num1 plus $num2 is `expr $num1 + $num2`' >> file.sh
Сказав это, я понятия не имею, зачем вам это. Просто используйте текстовый редактор. Это будет неудобно, когда вы хотите, чтобы в вашем сценарии были буквальные '
s.