grep и sed string с [] - поиск и замена текста: [xxxxxxxx] [duplicate]

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'") or die(mysql_error());

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

Иногда подавление запроса как @mysql_query(your query);

34
задан Skynet 26 October 2015 в 10:44
поделиться

7 ответов

Я смог воспроизвести это поведение с помощью Vista и Cygwin 1.7.0.

  • Две обратные черты вызывают ошибку
  • либо три или работают четыре обратной косой черты
  • Пять дают ту же ошибку

Две обратные косые черты становятся одной обратной косой чертой в оболочке, которая затем в sed ускользает от косой черты который является средним разделителем.

\\/ -> \/ (which makes the forward slash a regular character instead of a delimiter)

Три из них: первые два становятся едиными в оболочке, которые затем выходят из третьего в sed

\\\/ -> \\/

. Четыре: каждая пара становятся одиночными в оболочке, а затем первый результат уступает второму в sed

\\\\/ -> \\/ 

Edit:

О, я забыл сказать, что как одинарные кавычки, так и двойные кавычки работали то же самое для меня (cmd.exe не делает различия, которые делает Bash и др.).

36
ответ дан Dennis Williamson 28 August 2018 в 06:30
поделиться

Ваша оболочка (возможно, bash) делает свое собственное экранирование, и это вас путает. Вы можете использовать команду echo, чтобы увидеть, что передается, или легко написать специальную программу (обычно называемую «showargs» или аналогичную):

$ echo "s/\\\/\//"
s/\\/\//
$ echo "s/\\/\//"
s/\/\//

Вы также можете использовать одинарные кавычки, которые иначе говоря, в bash.

10
ответ дан user 28 August 2018 в 06:30
поделиться

Пожалуйста, покажите пример того, что у вас есть в будущем. в sed, скажем, вы хотите заменить «\» на трубу (|), например

$ cat file
asklfja \ asf

$ sed 's/\\/|/g' file
asklfja | asf

$ sed 's%\\%|%g' file #using different delimiter
asklfja | asf

, вам просто нужно уйти от нее один раз.

Изменить: к примеру @ OP, поскольку вы используете cmd.exe, а не bash / ksh, cmd.exe не любит одиночные кавычки. Я не могу создать ваш сценарий. Это работает для моего GNU sed на окнах, используя 2 слэша

, например

C:\test>echo "sample_input\whatever" | sed "s/\\/\//"
"sample_input/whatever"
4
ответ дан ghostdog74 28 August 2018 в 06:30
поделиться

В моей версии CYGWIN он работает, как говорит оригинальный плакат, но работает по-другому (обычно), если я использую одинарные кавычки.

$ echo "sample_input\whatever" | sed 's/\\/\//'
sample_input/whatever
$ echo "sample_input\whatever" | sed "s/\\/\//"
sed: -e expression #1, char 7: unterminated `s' command

Hmmm ..

1
ответ дан James K 28 August 2018 в 06:30
поделиться

Это связано с правилом синтаксического анализа строки sh с двумя кавычками.

Posix указывает, как sh анализирует строки с двойными кавычками.

Обратная косая черта сохраняет свое особое значение как escape-символ (см. Escape Символ (обратная косая черта)), только если за ним следует один из следующих символов: $ `" \

Другими словами, sh оставляет обратную косую черту, за которой следуют символы, отличные от символов $ '".

Итак, если sh встречает строку с двойными кавычками sed "s/\\\/\//", sh анализирует ее следующим образом.

  1. Первые два \\ изменяется на \. Поскольку за первым \ следует второй \.
  2. Третий и четвертый \ все еще остаются в строке. За ними следуют /, которые не являются особыми в строках с двойными кавычками.

После pasring sh передает строку s/\\/\// в sed, которая заменяет первое появление \ на /.

С теми же рассуждениями, когда sh встречает строку, "sed s/\\\\/\//", sh передает /\\/\// в sed, что также заменяет первое появление \ на /.

5
ответ дан MS.Kim 28 August 2018 в 06:30
поделиться

Замена одной обратной косой черты двумя на моем Cygwin требует этого выражения:

sed -e "s | \\ | \\\\ | g"

0
ответ дан OutputLogic 28 August 2018 в 06:30
поделиться

Я предполагаю, что вы предполагаете \\\n или \\\t в качестве трех обратных косых черт, но на самом деле его 2 обратные косые черты и другие паттерны

   backslash          \\
   newline            \n
   tab                \t

также могут / s/.../, / используется для открытых и закрытых частей.

, поэтому /\\\/\// будет \\ + \/ + \/ в соответствии с вашим обновленным примером

0
ответ дан YOU 28 August 2018 в 06:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: