Ваша проблема связана с цитированием и побегом. Давайте уменьшим строку, которую вы пытаетесь заменить, до следующего:
\w\[\033[00m\]\$
(с завершающим пробелом) - это содержит все трудности, но менее многословно.
Чтобы соответствовать этому, мы должны
\w
становится \\w
и т. Д. [
и ]
, потому что они особенные для sed: [
становится \[
, а \[
становится \\\[
(экранированный обратный слеш, экранированный [
) $
: \$
становится \\\$
Затем мы должны использовать одинарные кавычки вокруг нашей команды sed, чтобы оболочка не изменяла строку:
$ sed 's/\\w\\\[\\033\[00m\\\]\\\$ /Replace PS1/' <<< '\w\[\033[00m\]\$ '
Replace PS1
Он также может работать с двойными кавычками, но затем мы должны добавить еще один раунд экранирования для оболочки: \[
становится \\\[
(экранируется для sed) становится \\\\\\[
(сбежал за раковиной) и т. Д.
$ sed "s/\\\\w\\\\\\[\\\\033\\[00m\\\\\\]\\\\\\$ /Replace PS1/" <<< '\w\[\033[00m\]\$ '
Replace PS1
Двойные кавычки имеют смысл, только если вы используете переменные по понятным причинам.
Наконец, для вашей фактической строки:
$ echo '\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' \
| sed 's/\\\[\\033\[01;32m\\\]\\u@\\h\\\[\\033\[00m\\\]:\\\[\\033\[01;34m\\\]\\w\\\[\\033\[00m\\\]\\\$ /Replace PS1/'
Replace PS1
Самая простая вещь сделать, игнорируют первый показ. (Если это - допустимая вещь сделать), Примечание: при выполнении того же кода 10,000 раз он скомпилирует код далее, и Вы получаете лучшие результаты, таким образом, Вы могли бы хотеть проигнорировать первые результаты 10K для некоторых микросравнительных тестов.
Некоторые JVMs поддерживают нетерпеливую загрузку, но я не думаю, что JVM Sun делает.
Если Вы хотите вынудить классы быть загруженными, делают что-то вроде этого:
public class Main
{
static
{
loadClasses();
}
public static void main(final String[] argv)
{
// whatever
}
private static void loadClasses()
{
final String[] classesToLoad;
// even better, read them from a file and pass the filename to this method
classesToLoad = new String[]
{
"foo.bar.X",
"foo.bar.Y",
}
for(final String className : classesToLoad)
{
try
{
// load the class
Class.forName(className);
}
catch(final ClassNotFoundException ex)
{
// do something that makes sense here
ex.printStackTrace();
}
}
}
}
Правило № 1 для сравнительного тестирования Java: первые 15000 раз (или так) метод выполнения не интересны.
Этот поток содержит некоторый основательный совет: Как я пишу корректный микросравнительный тест в Java?
Использовать java -XX:+TraceClassLoading
прослеживать загрузку классов.
Использовать java -XX:+PrintCompilation
прослеживать, когда методы являются JITed.
После того как Вам загрузили классы, чтобы не выполнять использование интерпретатора -Xcomp
(на реализациях Sun) для выполнения скомпилированного кода только. Это могут быть очень медленные запускающие нормальные приложения этот путь, поскольку весь код должен быть скомпилирован, а не всего несколько частей.
Нет стандартного параметра командной строки, так как это не часть спецификации JVM. Ленивая загрузка класса (явно позволена как) часть спецификации JVM. Было бы возможно использовать Class.forName()
перед выполнением для загрузки классов, о которых Вы знаете, но это не является автоматически переходным.
Компиляция HotSpot также произведет первые несколько выполнений - метод интерпретируется несколько раз прежде чем быть скомпилированным, и процесс компиляции занимает время.