1

Я использую sed в Windows через порт GnuWin32. У меня есть текстовый файл input.txt с этим содержимым

ab

Я попробовал эти объединенные команды , чтобы отделить персонаж в новую строку , а затем удалить строку , содержащую этот символ, как я думал , что команды побежали по одному другу за другом

sed "s/a/\na\n/ ; /a/d" "input.txt" > "output.txt"

Тем не менее, я только что получил пустой файл output.txt . Если я разделю это на две разные команды

sed "s/a/\na\n/" "input.txt" > "output1.txt"
sed "/a/d" "output1.txt" > "output2.txt"

Тогда все работает просто отлично, файл output2.txt содержит только одну строку с символом b . Так что я сделал не так?

1 ответ1

3

Команда /a/d не удаляет строку; удаляет пространство шаблона. Хотя пространство шаблонов изначально содержит только одну строку, ваша первая команда замещения превращает пространство шаблонов в две строки. Чтобы удалить только строку, заканчивающуюся a , попробуйте:

$ sed "s/a/a\n/ ; s/[^\n]*a\n//" "input.txt"
b

Регулярное выражение [^\n]*a\n соответствует всему в строке, которая заканчивается a . Это заменено ничем.

С другой стороны , если вы хотите удалить из шаблона линии , которая состоит полностью из:

$ sed "s/a/\na\n/ ; s/\na\n//" "input.txt"
b

Документация

Документация sed понятна: команда d удаляет пространство шаблона.

Из руководства GNU sed:

d
Удалить пространство шаблона; немедленно начать следующий цикл.

Из спецификации POSIX awk:

[2addr] д
Удалите пространство шаблона и начните следующий цикл.

Как правило, пространство шаблонов sed состоит из одной строки, в этом случае различие между пространством шаблонов и шаблонов не имеет значения. Но есть много способов, таких как s/a/a\n/ , поместить несколько строк в пространство шаблона. В этом случае разница важна.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .