我试图删除每行中的空格,直到文件中每行的最后一个单词。
输入文件示例:
808 0 C01124 Amazon 45/234Birch 00 YYY
808 0 C01184 Flipkart 45/234Lotus 01 YYY
808 0 C01186 PrimeTime 45/23XCCCCH 08 YYY
808 0 C01125 DMART 5/23PPPPPPP 09 YYY
格式有点像上面的,空格不均匀,最后一个词总是“YYY”。我的要求是:我想保留 YYY 后面的空格,但我想删除所有其他空格。
期望的输出:
8080C01124Amazon45/234Birch00YYY
8080C01184Flipkart45/234Lotus01YYY
8080C01186PrimeTime45/23XCCCCH08YYY
8080C01125DMART5/23PPPPPPP09YYY
我尝试过使用sed
和tr
命令,但它变得一团糟,所有行都变成了一行。我想像上面那样隔离,但我无法达到要求。我该怎么做?
答案1
有很多种方法。最明显的,至少对我来说,是在 sed 中使用循环。
sed -e :loop -e 's/ *\(.*YYY\)/\1/;t loop'
(第一个斜杠后有两个空格)。只是:loop
一个标签。匹配s/ *\(.*YYY\)/\1/
一个或多个空格,后跟一些内容,然后是 YYY,并将其替换为不带前导空格的相同内容。如果发生替换,请t loop
查看标签。每次循环时,它都会删除 YYY 之前的一块空格。没有任何内容触及 YYY 之后的空格或其他任何内容。
答案2
和perl
,
perl -pe 's{\s.*YYY}{$& =~ s/\s//gr}e'
YYY
将删除包含 的行最右边出现的左侧的所有 ASCII 空白字符YYY
。
答案3
awk '{$1=$1}1' OFS= your_file
这就是您所需要的。分配给一个字段(在这种情况下是第一个)会带走所有额外的内容,并且空的 OFS 将这些字段缝合在一起,没有任何东西将它们分开。
答案4
这是您似乎在问的问题的答案:
sed 's/ *\([^ ]\)/\1/g'
这假设您只处理普通空格,而不是制表符。它查找一串空格,后跟一个非空格字符,然后将其替换为非空格字符。它在全球范围内执行此操作(在每条线上尽可能多次)。这将删除所有空格,除了行尾的空格(最后一个单词之后),因为它们后面没有非空格字符。
无论最后一个词是什么(不一定是YYY
),这都有效。仅包含空格的行将不改变地通过。
如果你确实想删除全部空间,使用更简单的答案之一来做到这一点。