如何使用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,\}
我有一个名为 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,\}