2013-10-11 3 views
0

Я хочу найти строку в некоторых файлах в рекурсивном каталоге и заменить ее на другую строку.Ошибка Grep и Sed

Строка, которую я хочу найти, это 0x04030000&0xffff0000.

Строка, которую я хочу заменить, - 0x80863a30.

Я попробовал несколько примеров, но grep и sed вызывают некоторые ошибки.

Как grep говорит 0xffff0000 command not found

Im Использование Mac OS X 10.8.5

Это была команда, я попробовал, и ошибка я получил:

localhost:~ User$ grep -rl 0x04030000&0xffff0000 /Users/Niresh/Desktop/TTT | xargs sed -i 's/0x04030000&0xffff0000/0x80863a30/g' 
[4] 1166 
-bash: 0xffff0000: command not found 
grep: warning: recursive search of stdin 

[4]+ Stopped     grep -rl 0x04030000 

пробовали это команда тоже, но не работает

localhost:~ Niresh$ mkdir TTT 
localhost:~ Niresh$ echo "TTT 0x04030000&0xffff0000 bar" > TTT/bar 
localhost:~ Niresh$ find TTT -type f -exec sed -i'' -e 's/0x04030000&0xffff0000/0x80863a30/g' {} \; 
localhost:~ Niresh$ cat TTT/bar 
TTT 0x80863a30 bar 
localhost:~ Niresh$ TTT 0x80863a30 bar 
-bash: TTT: command not found 

, но я пробовал это T оо СЕПГ -i «» -e «s/0x04030000 & 0xffff0000/0x80863a30/г» «Здесь был мой путь к текстовому файлу»

но команда Execute успешно, но текст все еще остается

Я читаю Человек Page СЕПГ Он показывает

Bugs многобайтных символов, содержащих байт со значением 0x5c (ASCII `\«) может быть неправильно трактуется как продолжение строки символов в качестве аргументов в a'', с»» и i'' commands. Multibyte characters cannot be used as delimiters with the s „“ и `` y ''.

BSD 10 мая 2005

+1

Покажите нам команду, которую вы попробовали, и объясните свою проблему несколькими примерами. – anubhava

+0

На какой ОС вы работаете? Вам необходимо предоставить _some_ информацию. Это бинарный файл, или вы просматриваете текстовые шестнадцатеричные дампы? Если вы хотите манипулировать двоичным файлом, sed и grep могут не делать этого. Awk не мог. Perl или другие языки сценариев. Если у вас есть двоичный файл и вы хотите получить шестнадцатеричный дамп, найдите вещь, замените ее и верните результат в двоичный файл, это может сработать. Но вы можете сделать это сложнее, чем нужно. –

+0

Mac OS X 10.8.5 Я не знаю, как получить Hext Dump? –

ответ

0

grep -rl 0x04030000 & 0xffff0000/Пользователи/Niresh/Рабочий стол/TTT | xargs СЕПГ -i 's/0x04030000 \ & 0xffff0000/0x80863a30/г'

& был идентифицирован как специальный символ, чтобы исправить это просто добавить слэш \ перед & (\ &) решил проблему

2

Ваш & в настоящее время interpeted вашей оболочкой. Чтобы избежать этого, вы должны процитировать поиска:

grep -rl '0x04030000&0xffff0000' /Users/Niresh/Desktop/TTT | xargs sed -i 's/0x04030000&0xffff0000/0x80863a30/g' 
+0

ничего не стоит, что sed также будет интерпретировать '&', если вы используете его в заменяющей строке. Его сейчас нет, но он может появиться позже. –

+0

не работает :( я Пробовал Эта команда Grep -rl «0x04030000 & 0xffff0000»/Users/Ниреш/Desktop/ТТТ но Его не показываются файлы, но Есть файлы Im конечно :) –

+0

@ user1862521: Я думаю, что ' -i' специфичен для GNU 'sed'. Возможно, поэтому он не работает для вас. – FatalError

0

Вы можете использовать следующее:

find /Users/Niresh/Desktop/TTT -type f -exec sed -i 's/0x04030000&0xffff0000/0x80863a30/g' {} \; 

Это должно сделать работу.

+0

Пробовал эту ошибку команды Несколько раз Эта строка sed: 1: "/ Users/Niresh/Desktop/T ...": дополнительные символы в конце команды N –

1

FatalError уже идентифицировал проблему & в вашей командной строке.

Кроме того, это плохой способ обработки файлов из-за проблемы Parsing LS. Вместо того, чтобы полагаться на xargs для захвата имен файлов в качестве результата grep, вы должны использовать find. Например:

# find /Users/Niresh/Desktop/TTT -type f \ 
    -exec grep -q '0x04030000&0xffff0000' {} \; \ 
    -exec sed -i'' -e 's/0x04030000&0xffff0000/0x80863a30/g' {} \; 

(разделить на несколько строк для удобства чтения.)

Идея заключается в том, что find будет нести ответственность за свои имена файлов, и будет работать каждый из инструментов, чтобы сделать (1) анализ и (2) модификация. Обратите внимание: grep здесь, вероятно, избыточен, так как sed просто не будет изменять файлы, в которых он не найдет строку поиска.

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

UPDATE (в комментариях):

работает для меня:

[email protected]:~ 507$ mkdir foo 
[email protected]:~ 508$ echo "foo 0x04030000&0xffff0000 bar" > foo/bar 
[email protected]:~ 509$ find foo -type f -exec sed -i'' -e 's/0x04030000&0xffff0000/0x80863a30/g' {} \; 
[email protected]:~ 510$ cat foo/bar 
foo 0x80863a30 bar 
[email protected]:~ 511$ 

Если это не работает для вас, пожалуйста update your question с результатами ваших попыток.

+0

Эта команда также не работает Протестировано сейчас :( –

+0

Вы уверены, что вы включили '-type f' для поиска и' -e' для sed? – ghoti

+0

, но он не редактирует –

Смежные вопросы