Ваша корневая файловая система заполнена, как и ваш временный каталог. Многим скриптам и программам требуется место для рабочих файлов, даже для файлов блокировки. Когда /tmp недоступен для записи, случаются плохие вещи.
Вы можете сделать это с помощью awk
.
Использование вашего примера здесь — один из способов сделать это.
awk '{print $0} /Samsung/ {print "prefix " $0}' filename
Разбивка заявления для вас :{print $0}
— напечатать всю строку
/Samsung/ {print "prefix " $0}
говорит печатать «префикс», за которым следует вся строка, но только если строка содержит Samsung.
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
Еще одна реализация sed, использующая «удерживаемое пространство»
sed '/Samsung/ {h; s/^/prefix /; H; g;}' file
Ссылка:https://www.gnu.org/software/sed/manual/html_node/Other-Commands.html
Используя POSIXly sed, мы можем удвоить строку, сохраняя в удержании, но добавляя к пространству шаблона только для Samsung
строк. Затем мы помещаем префикс сразу после новой строки, разделяющий повторяющиеся строки (Samsung
). Для других новая строка не будет отображаться, поэтому замена не произойдет, и sed напечатает пространство шаблонов без изменений.
sed -e '
h;/Samsung/G
s/\n/&prefix /
' file
Другой способ — сначала напечатать пространство шаблонов для всех строк. А затем, только для строк Samsung
, добавьте префикс и напечатайте их.
sed -ne '
p
/Samsung/s/^/prefix /p
' file
Это решение с использованием 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
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
$ 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», который может быть или не быть тем, что вы хотите, поэтому я подожду, пока вы уточните свои требования и предоставите лучший пример, прежде чем делать какие-либо дальнейшие предложения.