Unix 用于打印包含4个单词的行的脚本

Unix 用于打印包含4个单词的行的脚本,unix,sed,Unix,Sed,我从sed开始,我需要运行一个文件的行,用4个单词打印行,在这些行中,我应该打印第一个单词3次 我的意思是,如果提供此文件: Hello hi 123 if a equals b you one abc two three four dany uri four 123 这是输出: if if if a equals b dany dany dany uri four 123 这就是我所做的: sed `s/\(\<.\+\>\)\(\<.\+\>\)\{3\}/\1/

我从sed开始,我需要运行一个文件的行,用4个单词打印行,在这些行中,我应该打印第一个单词3次

我的意思是,如果提供此文件:

Hello hi 123
if a equals b
you
one abc two three four
dany uri four 123
这是输出:

if if if a equals b
dany dany dany uri four 123
这就是我所做的:

sed `s/\(\<.\+\>\)\(\<.\+\>\)\{3\}/\1/` F1
sed`s/\(\\)\(\\)\{3\}/\1/`F1
其中F1是一个现有文件。我被告知把所有的\都放进去,这样bash解释器就不会碰它了。以下是没有它们的脚本:

sed 's/(<.+>)(<.+>){3}/\1' F1
sed的/()({3}/\1'F1 错误是:

./P8.1: line 1: s/(<.+>)(<.+>){3}/1/: No such file or directory sed: -e expression #1, char 1: unknown command: `F'
/P8.1:line 1:s/()({3}/1/:没有这样的文件或目录sed:-e expression#1,char 1:未知命令:`F'
出了什么问题,我该如何解决

谢谢。

您可以尝试一种Awk方法

Awk示例

$ awk 'NF==4{print $1,$1,$0}' file
if if if a equals b
dany dany dany uri four 123

$ awk '{f = NF == 4 ? 1 : 0; $0 = $1 FS $1 FS $0}f' file
if if if a equals b
dany dany dany uri four 123
您可以尝试的Awk方法

Awk示例

$ awk 'NF==4{print $1,$1,$0}' file
if if if a equals b
dany dany dany uri four 123

$ awk '{f = NF == 4 ? 1 : 0; $0 = $1 FS $1 FS $0}f' file
if if if a equals b
dany dany dany uri four 123
您可以这样做:

sed -ne 's/^\(\w\+\)\(\W\+\w\+\)\{3\}$/\1 \1 &/p' 
sed -nre 's/^(\w+)(\W+\w+){3}$/\1 \1 &/p'
如果您使用的是GNU sed,那么使用
-r
标志更易于阅读,如下所示:

sed -ne 's/^\(\w\+\)\(\W\+\w\+\)\{3\}$/\1 \1 &/p' 
sed -nre 's/^(\w+)(\W+\w+){3}$/\1 \1 &/p'
说明:

  • 默认情况下,仅通过
    sed中的显式
    p
    命令,使用
    -n
    标志不打印行
  • \w
    是文字字符,
    \w
    是非文字字符
  • \1
    是第一个
    \(…\)
  • &
    是整个匹配模式。因为我们正在匹配
    ^…$
    这是整个原始行
  • 有了GNUSED中的
    -r
    -E
    在BSDSED中),我们可以将
    \(…)
    简化为
    (…)
    ,将
    \+
    简化为
    +
    \{…}
    简化为
    {…}
我不确定
\w
\w
是否能在所有系统中工作。如果它不起作用,您可以使用类似于
[a-zA-Z0-9\]
的东西代替
\w
[^a-zA-Z0-9\]
代替
\w
您可以这样做:

sed -ne 's/^\(\w\+\)\(\W\+\w\+\)\{3\}$/\1 \1 &/p' 
sed -nre 's/^(\w+)(\W+\w+){3}$/\1 \1 &/p'
如果您使用的是GNU sed,那么使用
-r
标志更易于阅读,如下所示:

sed -ne 's/^\(\w\+\)\(\W\+\w\+\)\{3\}$/\1 \1 &/p' 
sed -nre 's/^(\w+)(\W+\w+){3}$/\1 \1 &/p'
说明:

  • 默认情况下,仅通过
    sed中的显式
    p
    命令,使用
    -n
    标志不打印行
  • \w
    是文字字符,
    \w
    是非文字字符
  • \1
    是第一个
    \(…\)
  • &
    是整个匹配模式。因为我们正在匹配
    ^…$
    这是整个原始行
  • 有了GNUSED中的
    -r
    -E
    在BSDSED中),我们可以将
    \(…)
    简化为
    (…)
    ,将
    \+
    简化为
    +
    \{…}
    简化为
    {…}
我不确定
\w
\w
是否能在所有系统中工作。如果它不起作用,您可以使用类似于
[a-zA-Z0-9\]
的东西来代替
\w
[^a-zA-Z0-9\]
来代替
\w
,这可能适合您(GNU-sed):

这可能适用于您(GNU-sed):


你最好给出一行简单的代码。是的,这样bash解释器就不会改变我代码中的内容(比如如果我写*,它就不会用工作目录中的所有文件替换)。你最好给出一行简单的代码。是的,这样bash解释器就不会改变我代码中的内容(就像我写*,它不会用工作目录中的所有文件替换它)。谢谢,但我需要它在sed中。@shoham你没有
sed
。我没有看到任何系统只有
sed
和没有
awk
。这里是
awk
sed
更好做这项工作。谢谢,但我需要它在sed中。@shoham你没有
sed
。我没有看到任何系统只有
sed
和没有
awk
。这里是
awk
sed
更好做这项工作。非常感谢,特别是解释。非常感谢,特别是解释。