Я не можу знайти відповідний вираз 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