Как скопировать всю строку, которая соответствует строке, и вставить сразу после нее с префиксом?

Ваша корневая файловая система заполнена, как и ваш временный каталог. Многим скриптам и программам требуется место для рабочих файлов, даже для файлов блокировки. Когда /tmp недоступен для записи, случаются плохие вещи.

0
07.04.2021, 06:30
7 ответов

Вы можете сделать это с помощью awk.

Использование вашего примера здесь — один из способов сделать это.

awk '{print $0} /Samsung/ {print "prefix " $0}' filename

Разбивка заявления для вас :{print $0}— напечатать всю строку

/Samsung/ {print "prefix " $0}говорит печатать «префикс», за которым следует вся строка, но только если строка содержит Samsung.

4
28.04.2021, 22:53
n@praveen:~$ awk '{gsub("Samsung","Samsung\nprefix Samsung",$0);print }' filename

Apple 
Samsung
prefix Samsung
Nokia
HTC


sed '/Samsung/s/Samsung/&\nprefix &/g' filename

Apple 
Samsung
prefix Samsung
Nokia
HTC
-2
28.04.2021, 22:53

Еще одна реализация sed, использующая «удерживаемое пространство»

sed '/Samsung/ {h; s/^/prefix /; H; g;}' file

Ссылка:https://www.gnu.org/software/sed/manual/html_node/Other-Commands.html

1
28.04.2021, 22:53

Используя POSIXly sed, мы можем удвоить строку, сохраняя в удержании, но добавляя к пространству шаблона только для Samsungстрок. Затем мы помещаем префикс сразу после новой строки, разделяющий повторяющиеся строки (Samsung). Для других новая строка не будет отображаться, поэтому замена не произойдет, и sed напечатает пространство шаблонов без изменений.

sed -e '
  h;/Samsung/G
  s/\n/&prefix /
' file

Другой способ — сначала напечатать пространство шаблонов для всех строк. А затем, только для строк Samsung, добавьте префикс и напечатайте их.

sed -ne '
  p
  /Samsung/s/^/prefix /p
' file
0
28.04.2021, 22:53

Это решение с использованием GNU sed. Он находит строку «Samsung» и заменяет собой, а также добавляет новую строку с совпавшим шаблоном «Samsung», добавляя в ее начало «префикс»:

# doubled the example data to show it works on every line
$ sed 's/^Samsung$/&\nprefix &/' file
Apple 
Samsung
prefix Samsung
Nokia
HTC
Apple 
Samsung
prefix Samsung
Nokia
HTC
2
28.04.2021, 22:53
sed -n 'p;s/^Samsung$/prefix &/p' file >newfile

Сначала выводится текущая строка. Затем он заменяет строку Samsungна prefix, пробел и совпадающую строку (, до которой &будет расширяться в замещающей строке ), эффективно вставляя строку prefixперед Samsungв каждой строке, то есть только Samsung. Если замена прошла успешно, измененная строка печатается, создавая дополнительную новую строку в выводе.

Затем вывод записывается в новый файл, newfile.

Если вы хотите ослабить сопоставление строки Samsung, чтобы она совпадала в любом месте строки, используйте, например,

sed -n 'p;s/.*Samsung/prefix &/p' file >newfile

Использование awkдля реализации эквивалента описанного выше:

awk '1; /^Samsung$/ { print "prefix", $0 }' file >newfile

Одинокий 1— это сокращенный -способ написания { print }, который, в свою очередь, совпадает с { print $0 }, который выводит текущую строку.

Используйте просто /Samsung/для сопоставления строки Samsungв любом месте строки вместо того, чтобы требовать, чтобы строка была именно этой строкой.

Запутанный вариант команды awkвыше:

awk '1; /^Samsung$/ && $0 = "prefix " $0' file >newfile
3
28.04.2021, 22:53
$ awk '{print} $0=="Samsung"{print "prefix", $0}' file
Apple
Samsung
prefix Samsung
Nokia
HTC

С более полным тестовым примером представьте, что вы пытаетесь продублировать строку test.*в этом входном файле:

$ cat file
Apple
the testing regexp match failure case
Samsung
the test.* partial string match failure case
Nokia
test.*
HTC

Таким образом, в выводе должна быть продублирована только вторая -последняя строка test.*. Мой скрипт выполняет полное совпадение строки -, поэтому проблем нет, он дублирует только одну строку, которая является точно строкойtest.*:

$ awk '{print} $0=="test.*"{print "prefix", $0}' file
Apple
the testing regexp match failure case
Samsung
the test.* partial string match failure case
Nokia
test.*
prefix test.*
HTC

Попробуйте тот же случай с другими имеющимися у вас решениями.

Если вы хотите выполнить частичное совпадение строки, вам может понадобиться:

awk '{print} index($0,"Samsung"){print "prefix", $0}' file

но это будет соответствовать «Samsungtheblues», который может быть или не быть тем, что вы хотите, поэтому я подожду, пока вы уточните свои требования и предоставите лучший пример, прежде чем делать какие-либо дальнейшие предложения.

1
28.04.2021, 22:53

Теги

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