如何使用sed将具有3个单词的行中的第一个单词加倍?

how to double the first word in a line that have 3 words using sed?

我有一个名为 test 的文件,其中包含:

1 2 3
2 3
4 5 6 7
8 9 10
11 12 13 14 15 16 17
18 19 20

我想获取其中有3个单词的行,然后打印它们,而第一个单词是重复的。

我不会用pipeline,我可以用>|将其放入 tmp 文件并从中读取。

所以这种情况下的输出是:

1 1 2 3
8 8 9 10
18 18 19 20

我或多或少地了解我需要什么常规表达式,但其余的我很挣扎,有人可以帮忙吗:?

这就是我所做的:

sed 's/'^[^ ]*[ ]+[^ ]+[ ]+[^ ]+[ ]*$'/&&/1/ test

我知道这不是解决方案,但请帮助我理解:/

sed 不是 space 分隔数据的首选工具。由于已经有使用 sed 的答案,因此这里有一些替代方案:

awk

awk 'NF==3 { print , , ,  }' < test

普通 POSIX shell

#!/bin/sh
while IFS=' ' read -r a b c d; do
    if [ ! -z "$a" -a ! -z "$b" -a ! -z "$c" -a -z "$d" ]; then
        echo "$a $a $b $c";
    fi
 done < test

你可以试试这个,

$ sed -nr 's/^([^ ]+) +[^ ]+ +[^ ]+$/ &/p' file
1 1 2 3
8 8 9 10
18 18 19 20

来自man sed

-n, --quiet, --silent
             suppress automatic printing of pattern space
p      Print the current pattern space.

^ 断言我们在开始。 (..) 称为捕获组,用于捕获字符。稍后您可以通过向后引用它的索引号来引用那些捕获的字符。 ([^ ]+) 捕获任何字符但不属于 space 一次或多次。 + 重复前一个标记一次或多次。 $ 断言我们在行尾。

$ sed -n 's/^\([^[:blank:]]\+\)\([[:blank:]]\+\)[^[:blank:]]\+[[:blank:]]\+[^[:blank:]]\+$/&/p' file
1 1 2 3
8 8 9 10
18 18 19 20

[^[:blank:]]\+ 匹配一个或多个非 space 字符。 [[:blank:]]\+ 匹配一个或多个 space 个字符。 & 在替换部分将打印所有匹配的字符。

这里是一个 sed 解决方案,只接受单词字符:

$ sed -n "s/^\(\([a-zA-Z0-9]\+\) [a-zA-Z0-9]\+ [a-zA-Z0-9]\+$\)/ /p" test.txt
# Posix
sed '/^\([^ ]\{1,\}\)\( [^ ]\{1,\}\)\{2\}$/ !d;s// &/' YourFile

# GNU
sed '/^([^ ]+)( [^ ]+){2}$/ !d;s// &/' YourFile

假设 space 只有 1 个 space 字符(如果不是,只需更改 space 匹配 [[:space:]]\{1,\}