LINUX.ORG.RU

помогите написать скрипт


0

1

есть директория с файлами и поддиректориями. я хочу пройтись по всем файлам и удалить текстовую строку. гуглил, кое что написал но не работает

вот мое творение

#!/bin/sh

for file in *; do sed 's/<Script type=\'text\/javascript\' language=«javaScript» Src=«\/prototype_.js» ><\/scripT >//' $file; done

получаю ошибку или 1.sh: 4: Syntax error: Unterminated quoted string или 1.sh: 4: Syntax error: redirection unexpected

удалить надо такую строку <Script type='text/javascript' language=«javaScript» Src=«/prototype_.js» ></scripT >

какие будут идеи?

Да, в качестве разделителей sed'а в данном случае удобно было бы использовать, например, вертикальную линию, а не слеш. Кроме того, следует помнить, что точка - это спец. символ и ее надо экранировать.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

точку экранировал, поэкранировал уже что можно

sed 's/\<Script type=\'text\/javascript\' language=«javaScript» Src=«\/prototype_\.js» \>\<\/scripT \>//i' $file;

но таже фигня Unterminated quoted string

kommersant ★★
() автор топика
Ответ на: комментарий от Eddy_Em

У него трабла с «Syntax error».
Думать лень, но если выражение, которое скармливается седу записать в файл и этот файл указывать через -f, то прокатывает. По крайней мере, проблем с синтаксом нет.

NightSpamer
()
Ответ на: комментарий от kommersant

Unterminated quoted string

sh воспринимает как одно целоё всё от одного апосторофа до другого, без анализа внутренностей. То, что ты экранировал апостроф, ей пофигу поэтому. :)

Попробуй так:

 "s/\<Script type='text\/javascript' language=\"javaScript\" Src="\/prototype_\.js" \>\<\/scripT \>//i"

geekless ★★
()
Ответ на: комментарий от kommersant

sed 's/\<Script type=\'text\/javascript\' language=«javaScript» Src=«\/prototype_\.js» \>\<\/scripT \>//i' $file;

Вы уверены, что правильно экранируете "?

а как ему скормить списоком?

sed -i ... * вестимо

anonymous
()

find /path -type f -print0 | xargs -0 sed «s,<Script type='text/javascript' language=„javaScript“ Src=»/prototype_\.js" ></scripT >,," -i

AnDoR ★★★★★
()
Ответ на: комментарий от NightSpamer

Тут не «думать лень». Тут просто тред-детектор не читавших man bash.

       Enclosing characters in single quotes preserves the literal value of each character within the quotes.  A single quote may not occur between single quotes, even when preceded by a backslash.
geekless ★★
()
Ответ на: комментарий от geekless

// черт, часть кавычек забыл экранировать. ну в общем ты понял суть.

geekless ★★
()

Во-первых, вместо `for file in *` я бы использовал find. Во-вторых, «Syntax error: redirection unexpected» однозначно намекает, что твои угловые скобки распознаются, как знак перенаправления. А ещё ты неправильно экранируешь одинарные кавычки. Надо так:

sed 's/<выражение с одинарной кавычкой'\''>/<выражение2>/'
То есть ты должен открытую одинарную кавычку закрыть такой же одинарной кавычкой, потом через обратный слеш экранировать ту кавычку, которая является частью выражения и потом продолжить конструкцию, открыв одинарные кавычки снова и закрыв их.

Deleted
()
Ответ на: комментарий от Deleted
fargred@localhost ~ $ echo '><><><><>>' > t
fargred@localhost ~ $ cat t
><><><><>>
fargred@localhost ~ $ sed 's/>/-/g'  t
-<-<-<-<--
fargred@localhost ~ $ sed 's/\' \'>/-/g'  t
> ^C
fargred@localhost ~ $ sed 's/'\''>/-/g'  t
><><><><>>
Deleted
()
Ответ на: комментарий от Eddy_Em

cледует помнить, что точка - это спец. символ и ее надо экранировать.

Но с ключом «-r» — необязательно :3

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.