Замените маркер в текстовом файле с произвольным новым текстом

Существует несколько решений. Принятие Вас не имеет имени файла, запускающегося с -

ls -li | grep " -"
ls -li | awk '/ -/'

Если каталог содержит -, это может быть зафиксировано

ls -li | grep "[0-9][0-9]* -"
ls -li | awk '$2 ~ "-.{9}"'
4
16.11.2014, 00:45
4 ответа

Так как у вас было решение Perl, вот другой. Я использую Rep.txt для хранения замены:

$ perl -pe '$re=`cat rep.txt`; chomp($re); s/%SUBSTITUTE%\n/$re/' file.txt
foo
bar
multi
  line
string
foo

, который читает каждую строку целевого файла ( file.txt ), затем применяет скрипт, указанный - E к нему и печатаю ( -P ).

0
27.01.2020, 20:49

Я нашел следующее решение, основанное на awk :

text=`cat "filepaste"`
export text;
<"$file" awk '
    BEGIN {REPLACE=ENVIRON["text"] "\n%SUBSTITUTE%" }
    {gsub(/^%SUBSTITUTE%$/, REPLACE); print}
'

здесь «FilePaste» содержит контент для замены % заменителей% . Преимущество состоит в том, что эта строка может быть выполнена при использовании различных инструментов оболочки без необходимости сохранить его обратно в файл. Чтение AWK Переменная Заменить из переменной среды избегает расширения скрепленных символов в текста .

2
27.01.2020, 20:49

Вот еще один способ с использованием ED .
Вставьте все содержание в файла перед маркером (то есть до линии, содержащей %, заменяют% ):

ed -s originalfile <<< $'/%SUBSTITUTE%/- r FILE\nw\nq'

Где:
/% заменитель% / : наборы Адрес на первом сопоставлении строки % Заменяет%
- или -1 : Офселы Обратитесь к одной строке до
r Файл : Считается файл адресованная линия.
W : пишет на ОригиналFile (заменить с , p , чтобы просто распечатать содержимое вместо записи)
q : Выход для редактора

Замена файла С ! Echo «$ Text» вставит содержимое $ Text перед маркером:

export TEXT
ed -s originalfile <<'IN'
/%SUBSTITUTE%/-1 r !echo "$TEXT"
w
q
IN
3
27.01.2020, 20:49

Если у вас есть версию GNU SED, вы сможете использовать команду R для чтения и вставки нового контента из файла, затем удалить линию маркера E.G.

sed '/%SUBSTITUTE%/{
r path/to/newcontent
d
}' file

Если вы хотите сохранить изменение % Marker% Marker после вставку, это сложно, потому что все, что вы делаете, GNU R очереди расширения Содержание файла До конца конца нынешнего цикла шаблона (сохраняя его до , просто было бы вопросом удаления команды d ). Вероятно, самый простой способ - добавить его в файл NewContent : вы могли бы сделать это на лету, как

sed '/%SUBSTITUTE%/{
r /dev/stdin
d
}' file < <(sed '$a %SUBSTITUTE%' path/to/newcontent)

, принимая совершенно другой подход, вы можете разделить первый файл на % заменителя% А потом кошка в новом контент

csplit -s file '/%SUBSTITUTE%/'
cat xx00 newcontent xx01

Вы также можете сделать Bash , прочитайте цикл по линии первого файла, и кота нового файла содержимого при соответствующем строке маркера - однако я ' У меня были мои костяшки, поступающие за предложение о чтениях петлей для обработки текста на этом форуме. К сожалению, не предоставляет установленное решение.

4
27.01.2020, 20:49

Теги

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