-1

而且我习惯于 vi 而不是 vim。对于我的工作,我目前正在尝试使用 ksh 和 vi 制作脚本。我想要做的是能够打开和搜索关键术语的文件并提取信息。例如,我想运行一个 ksh 脚本,在文件中搜索关键字“主题”,然后提取信息“第一行”。我想使用 vi 的原因是因为我想将我提取的值写入一个文件,并用逗号分隔一行。

Subject: line one
Content: line two

感谢您的任何帮助和参考。

编辑:是的,使用 sed、awk 和 grep 是一种更有效的方法。但是我在将结果分配给 ksh 中的变量时遇到问题,目前我有:

testing=grep Primary /u/mtjandr/temp.txt | sed -e 's/[:a-zA-Z]* //g' 
grep Primary /u/mtjandr/temp.txt | sed -e 's/[:a-zA-Z]* //g' 

它本身会输出正确的结果,但是当我尝试将其分配给变量时,我得到了错误

copy_group.sh[18]:主要:未找到。

更新:我找到了我的解决方案:

testing=`grep Primary /u/mtjandr/temp.txt | sed -e 's/[:a-zA-Z]* //g'`
4

2 回答 2

1

鉴于您的文件可能看起来很正常,您可能需要查看awk,grep并且sed正如 Shawn 所提到的。Grep为您提供您感兴趣的行,awk提取字段并sed编辑整个内容。

因此,在您的示例中,您可能希望找到包含以下内容的行Subject

grep Subject file

并提取line one

awk '{printf "%s %s,", $2, $3}'

最后删除,文件末尾插入的额外内容

sed 's/,$//'

这三个命令需要通过管道连接在一起:

grep Subject file | awk '{printf "%s %s,", $2, $3}' | sed -e 's/,$//'

当然,该awk部分需要根据您的确切文件结构进行定制。

最后,要将整个内容写入另一个文件(而不是输出),您可以将上述命令的输出重定向到一个文件:

grep Subject file | awk '{printf "%s %s,", $2, $3}' | sed -e 's/,$//' > other_file
于 2012-06-01T15:33:28.573 回答
0

正如我在上面的评论中所说,还有许多其他更简单的方法可以使用专为此目的而设计的工具来实现这一目标,例如sedawkgrep

如果您确实决定放弃尝试vi,那么这里有一个使用单个awk命令的版本:

awk '/^Subject: /{printf "%s%s",x,substr($0,10);x=","}' in.txt > out.txt

例子:

[me@home]$ cat in.txt
Subject: line one
Content: line two
Subject: line three
yadda yadda

[me@home]$ awk '/^Subject: /{printf "%s%s",x,substr($0,10);x=","}' in.txt > out.txt
[me@home]$ cat out.txt
line one,line three

这个x=','位是为了让我们可以在除第一个输出之外的所有输出前加上逗号。为了更易读,我们可以简单地将输出记录分隔符 (ORS) 从\n更改为逗号。这个howerer 将导致一个尾随逗号,我们需要用另一个命令删除它。

在此示例中,我们将输出通过管道传输sed到以删除尾随分隔符:

awk -v ORS=',' '/^Subject: /{print substr($0,10)}' in.txt | sed -e 's/,$//' > out.txt

命令分解:

awk -v ORS=',' '/^Subject: /{print substr($0,10)}' in.txt | sed -e 's/,$//' > out.txt
    _________   __________   ___________________   ______   _______________ _________
       |             |               |                |             |           |
 separate output     |          OUtput the line       |      Remove trailing    |
 records with        |           from char 10         |           comma         |
 comma (not \n)      |             onwards            |                         |  
                     |                                |                  Redirect output
             Match lines that                    input file                to out.txt
           start with "Subject :"
于 2012-06-01T15:55:45.617 回答