убрать все со строки, начинающейся после пробела - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть файл с таким содержимым:

lines
lines
rootdev=UUID=967d8dc3-f595-4a6e-929e-cc89as5a1a2s               /               ext4    defaults,
lines

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

lines
lines
rootdev=UUID=967d8dc3-f595-4a6e-929e-cc89as5a1a2s
lines

Есть идеи, как это сделать с помощью одной строки команды?(поэтому мне не нужно открывать nano с этим файлом и делать это вручную)

Я пытался с sed, но он просто заменяет слово rootdev

sed -i 's/rootdev//g' file.txt

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Сначала найдите строку, начинающуюся с rootdev=, а когда найдете, удалите все после первого пробела до конца строки.

sed -i '/^rootdev=/ s/ .*$//' file

Использование группы захвата для сохранения rootdev=...часть, и замена всей строки с этим также вариант.

sed -i 's/^\(rootdev=[^ ]*\).*$/\1/' file
0 голосов
/ 21 ноября 2018

Ваша попытка с sed не может работать, потому что она просто удалит строку rootdev с пустой строкой.Вам нужен инструмент, который соответствует шаблону и выполняет действие со всей этой строкой, для которого, я думаю, awk более рекомендуется, чем sed.

Использование awk для сопоставления линии, чтобы удалить ее.пробелов, использующих gsub(), должно быть достаточно,

awk '/^rootdev/{ gsub(/[[:space:]].*/,"",$0) }1' file

Если вы используете GNU awk с версией, превышающей 4.1.0, вы можете использовать опцию редактирования на месте, чтобы вносить изменения динамически

gawk -i inplace '/^rootdev/{ gsub(/[[:space:]].*/,"",$0) }1' file

для более ранних версий используйте временный файл

awk '/^rootdev/{ gsub(/[[:space:]].*/,"",$0) }1' file > temp && mv temp file

или используйте sponge из moreutils.Если его нет в вашей системе, загрузите его на RHEL, используя yum install moreutils или apt-get в Debian.

awk '/^rootdev/{ gsub(/[[:space:]].*/,"",$0) }1' file | sponge file
...