Как вставить строку в текстовую переменную в указанной позиции

Убедитесь, что версия JVM (32/64 бит), которую вы используете, соответствует версии eclipse (32/64 бит).

Я считаю эти строки противоречивыми.

64-разрядная серверная виртуальная машина Java HotSpot ™ (сборка 23.25-b01, смешанный режим)

arch x86

5
07.06.2017, 21:53
3 ответа

Как вы говорите, если у вас есть данные в переменной, а не в файле, вы не можете sed их напрямую. Тем не менее, это по-прежнему простой способ сделать то, что вы просите; вам просто нужно его конвейеризировать:

#!/usr/local/bin/bash
text="loremipsumNEEDLEdolorsitamet"
word="HAYSTALK"
match="NEEDLE"

echo "$text" | sed "s/$match/&$word/g"

Демонстрационный вывод:

$ ./369818.sh
loremipsumNEEDLEHAYSTALKdolorsitamet
3
27.01.2020, 20:32

Вставить текст jв переменную textв позиции p(, считая с нуля):

p=5
text="$(seq 10)"               ## arbitrary text
text="${text:0:p}j${text:p}"

Чтобы вставить текст jперед совпадающей частью в$match:

text="${text%%${match}*}j${match}${text##*${match}}"

Это извлекает начальную часть $text, пока не найдет $match, затем добавляет j, затем $match, затем замыкающую часть $text, пока не найдет $match. Будем надеяться, что $matchесть только одно совпадение в $text!

16
27.01.2020, 20:32

Для надежного выполнения операции вам потребуются следующие подпрограммы обработки строк:

text_new=${text%%"${match}"*}${word}${text#*"${text%%"${match}"*}"}
#         |------- A -------| |-B--| |------------ C -------------|
  • A— это часть до -совпадения, то есть строка перед началом сопоставления.
    • Он генерируется, когда вы стоите в конце строки, смотрите в начало строки и срываете до последнего появления текста совпадения включительно.
  • B— данные для вставки.
  • C— это часть совпадения после -, то есть строка после окончания совпадения.
    • Он генерируется путем стояния в начале строки, взгляда в конец строки и разрыва до и включая первое обнаружение того, что было результатом Шага. -A.
  • Обратите внимание, что строка совпадения заключена в кавычки, чтобы любые содержащиеся в ней метасимволы не были поняты подпрограммами bashparameter expansion.
  • Должное внимание уделяется возможности совпадения в строке более одного раза. Первая спичка слева заменяется.
  • Также учитывается случай строки с переводом строки.

Сэд

match_esc=$(printf '%s\n' "$match" | sed -e 's|[][^\/.*$]|\\&|g' | sed -e 'H;1h;$!d;g;s/\n/\\n/g')
 word_esc=$(printf '%s\n' "$word"  | sed -e 's|[\&/]|\\&|g;$!s/$/\\/')
printf '%s\n' "$text" | sed -e 'H;1h;$!d;g;'"s/$match_esc/$word_esc&/"''
  • Метод sedявляется более запутанным, так как мы должны убедиться, что все символы, имеющие значение для sedи появляющиеся во входном тексте, должны быть отключены. Еще один уровень сложности заключается в том, что эти символы различны для левой и правой команд s/// команды sed.
  • Следующим шагом является определение этих символов, а затем их заглушение.
  • После этого можно просто запустить текстовые данные через обычный sed s/// материал.
4
27.01.2020, 20:32

Теги

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