Unix 用于打印包含4个单词的行的脚本
我从sed开始,我需要运行一个文件的行,用4个单词打印行,在这些行中,我应该打印第一个单词3次 我的意思是,如果提供此文件: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/
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
在BSDSED中),我们可以将-E
简化为\(…)
,将(…)
简化为\+
和+
简化为\{…}
{…}
\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
在BSDSED中),我们可以将-E
简化为\(…)
,将(…)
简化为\+
和+
简化为\{…}
{…}
\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
更好做这项工作。非常感谢,特别是解释。非常感谢,特别是解释。