/ / SED - видалення рядка з подальшим LineFeed (n) - linux, unix, sed, awk, vi

SED - видалення рядка, за яким слідує LineFeed (n) - linux, unix, sed, awk, vi

Я не можу знайти відповідний вираз sed для видалення слова, за яким слідує рядок return (n)

Тестовий файл:

line1n
line2n
line3markn
line4n
line5n

і я хочу видалити всі випадки від’їзду Markn, у цьому випадку:

line1n
line2n
line3line4n
line5n

шукали та можете використовувати:

sed "s/n//g" test.file  to remove ALL n"s

але

sed "s/markn//g" test.file does not work

Дивно, але s / markn // g, здається, працює нормально in vi в інтерактивному режимі.

Будь-яка допомога з вдячністю!Я хотів би зрозуміти, як це зробити за допомогою SED, якщо це можливо, оскільки я впевнений, що це можливо !! Однак, якщо це можна зробити по-іншому, тоді я також задоволений, поки це знаходиться в командному рядку, оскільки воно повинно запускати багато файлів.

Велике дякую.

Відповіді:

6 за відповідь № 1

Для реальних каналів рядків використовуйте:

sed -e ":a; /mark$/ { N; s/markn//; ba; }"

Усі рядки, які закінчуються позначкою, поєднуються з наступними, а тепер середній n видаляється.

Якщо є буквальний рядок n в кінці рядка, вам потрібно вийти з як \n.


4 для відповіді № 2

Це має зробити фокус:

sed -i ":a;N;$!ba;s/markn//g" file

Пояснення:

;    command separator within sed
:a   a label, like in C/C++
N    appends the next line to the pattern space
$!ba repeats the N command for all lines but the last line

sed продовжується так. він читає стандартне введення в простір шаблонів, виконує послідовність команд редагування в просторі шаблонів, а потім записує простір шаблонів у STDOUT.

Коли ти робиш щось подібне

sed -i "s/markn//" file

рядки копіюються в простір шаблонів по одному.

:a;N;$!ba додає кожен рядок до простору зразків.

Тоді простір шаблону можна обробити за один прохід, видаливши будь-який markn , the g варіант, для глобального, тут важливий, оскільки він просить sed не зупинятися на першому збігу шаблону.


2 для відповіді № 3

я бачив awk тег, отже, ми йдемо.

Якщо n є "поверненням рядка", awk може приєднати рядок, що закінчується "позначкою", наступним рядком.

$> awk "/mark$/ { sub(/mark$/,""); getline t; print $0 t; next }; 1" ./text
line1
line2
line3line4
line5

1 для відповіді № 4

Якщо ви можете використовувати awk, ви можете це зробити

awk "
/mark$/ {sub(/mark$/, ""); hold = hold $0; next}
{print hold $0; hold = ""}
END {if (hold) print hold}
"

1 для відповіді № 5

вже є багато відповідей, sed і awk.

Я додаю ще один, з awk, просто покажіть, що awk може це зробити коротшою командою:

awk "gsub(/mark$/,""){printf $0;next;}1" input

тест:

kent$  echo "line1
line2
line3mark
line4
line5"|awk "gsub(/mark$/,""){printf $0;next;}1"

вихід:

line1
line2
line3line4
line5

не знаю, чи справді це розшукується.


0 для відповіді № 6

Просто скористайтеся наступною командою

sed -e "{:q;N;s/markn//g;t q}" test.file

0 для відповіді № 7

Це може працювати для вас:

sed -e "1{h;d};H;${x;s/markn//g;p};d" test.file

0 для відповіді № 8
awk "{sub(/line4/,"line3line4")}!/mark/" file

line1n
line2n
line3line4n
line5n