使用 sed 进行自定义字符串空间操作

使用 sed 进行自定义字符串空间操作

以下命令:

head -n 1 $FILE | tail -n 1

从 的第一行提取文本$FILE。 中每行的格式$FILE如下:

1 2 3 4  2 3  3 4 5  4 5 6 7 8 9

如您所见,每个字符之间都由一个空格分隔。每个组之间都由两个空格分隔。使用sedI 需要删除单个空格,并将双空格转换为单个空格。

中的文本$FILE由嵌套在另一个 for 循环中的 for 循环创建。因此,在嵌套 for 循环运行完毕后,每行上的文本数据都会从主 for 循环重定向>>$FILE。文本字符串中的每个字符/数字都是嵌套 for 循环完成一次的结果。然后,主 for 循环将嵌套 for 循环的输出发送到$FILE

伪代码的一个例子是:

for i in $(seq 1 $RANDOM)
do
    for n in {1..10}
    do
        $do_something
    done

$do_something_else
done >> $FILE

head -n 1 $FILE | tail -n 1 | (sed command here)

上述代码的结构与此处的需求无关。我只是寻求一种轻量级方法,用于上述有关空格的文本操作。如果之前有人问过这个问题,我很抱歉。我在查询中找不到它。

答案1

这应该有效:

sed 's/ \([^ ]\)/\1/g'

您还可以用以下内容替换脚本的整个最后一行:

sed -n '1s/ \([^ ]\)/\1/gp' "$FILE"

答案2

这个怎么样:

$ head -n1 $FILE | tail -n 1 | sed 's,  ,|,g' | sed 's, ,,g' | sed 's,|, ,g'
1234 23 345 456789

首先,我们用 替换所有出现的双空格,|以将它们与单个空格区分开来,然后我们删除所有单个空格,最后我们|用单个空格替换。

答案3

s您可以在 sed 中使用单个命令完成替换:

s/ \( \?\)/\1/g

要在第一行之后退出,我们可以q在第一行退出。​​把它们放在一起:

sed -e 's/ \( \?\)/\1/g' -e '1q'

相关内容