5

У меня есть файл, который содержит (много) строк, которые я хотел бы заменить, поэтому я подумал об использовании простой команды, такой как:

sed 's/string1/string2/g' file1 > out  

Тем не менее, есть слишком много строк для повторения вручную. Таким образом, я составил список всех строк, подлежащих замене, каждая в строке, и назвал его файлом A. Затем я составил список всех замещающих строк и назвал его файлом B.

Есть ли способ сделать что-то вроде:

sed 's/line i of file A/line i of file B/g' file1 > out

для каждой строки файла A?

4 ответа4

3

Было бы проще создать файл со строками ввода и замены в одной строке (при условии, что ни строки ввода, ни строки замены не содержат пробелов). Тогда вы можете сделать что-то простое, как:

while read n k; do sed -i 's/$n/$k/g' file1; done < fileA

РЕДАКТИРОВАТЬ:

Увидев ответ Никакина, я понял, что вы можете сделать то же самое с двумя файлами, которые вы сочетаете с моим предложением:

paste fileA fileB | while read n k; do sed -i 's/$n/$k/g' file1; done 
1

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

tmpfile=/tmp/Asasuser.$$
exec 3< fileA
exec 4< fileB
while read –r astring <&3
do
        read –r bstring <&4
        echo "s/$astring/$bstring/" >> "$tmpfile"
done
exec 3<&- 4<&-
sed –f "$tmpfile" file1 > out
rm –f "$tmpfile"

Это предполагает, что fileA и fileB имеют одинаковое количество строк (и что это число больше нуля), и что ни у одной из них нет символов экранирования / .

1

Мы можем просто создать команду, которая нам нужна. Допустим, файлы со списками называются lista и listb. Тогда мы можем использовать:

$ for i in $(paste lista listb -d/); do echo -n "-e 's/$i/g' "; done

создать опцию для сед. Теперь мы можем использовать его с eval. Допустим, наш файл называется test. Мы используем:

$ eval "sed" $(for i in $(paste lista listb -d/); do echo -n "-e 's/$i/g' "; done) "test"
0
paste -d : fileA fileB | sed 's/\([^:]*\):\([^:]*\)/s%\1%\2%/' > sed.script
sed -f  sed.script SOURCE-FILE

SOURCE-FILE может быть отдельным файлом или несколькими файлами. Текст в файлах A и B не может содержать двоеточия или символы процента, но может содержать пустые символы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .