Я пытался заменить строку на другую, используя SED
on MAC OS X Terminal
У меня есть сценарий, в котором мне нужно заменить строку во всех файлах, присутствующих в каталоге, на другую строку. Обе строки сложные и имеют разные специальные символы и знаки.
Как мне его заменить?
Мне нужно заменить
import { wait } from 'path/and-child-path'
с
import { wait } from 'path/path/and-child-path'
То, что я пытался сделать, это
find . -type f | xargs sed -i '' "s@import { wait } from 'path/and-child-path'@import { wait } from 'path/and-child-path'@g"
Это не работает. Пожалуйста, помогите мне.
решение1
Указанный вами файл sed
имеет тот же самый шаблон сопоставления и замены (если это не опечатка), поэтому вы не можете ожидать никаких изменений в файлах. Кроме того, этого ''
бита там быть не должно.
Исправив эти моменты, выбыв конечном итоге с
find . -type f | xargs sed -i \
"s@import { wait } from 'path/and-child-path'@import { wait } from 'path/path/and-child-path'@g"
Этот код все равно не сработаетв общем случае, поскольку имена файлов могут содержать пробелы (и даже символы новой строки!), которые как раз и xargs
используются в качестве разделителей. Так что если у вас есть файл A X
, sed
будет указано действовать на файлы A
и X
.
-exec
вариант решает проблему просто:
find . -maxdepth 1 -type f -exec sed -i \
"s@import { wait } from 'path/and-child-path'@import { wait } from 'path/path/and-child-path'@g" {} +
Обратите внимание, я также добавил -maxdepth 1
, иначе find
пришлось бы спускаться и в подкаталоги.