从空格开始的行中删除所有

时间:2018-11-21 11:59:39

标签: linux sed sh

我有一个包含以下内容的文件:

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 :(得分:2)

您尝试使用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。如果它在您的系统中不可用,请使用yum install moreutils或Debian中的apt-get在RHEL上获得它。

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

答案 1 :(得分:1)

首先,搜索以rootdev=开头的行,当找到该行时,删除第一个空格之后直到行尾的所有内容。

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

使用捕获组保留rootdev=...并将其替换为整个行也是一种选择。

sed -i 's/^\(rootdev=[^ ]*\).*$/\1/' file