Linux查找和替换(有条件的)

时间:2015-01-14 19:12:27

标签: linux awk

我有一个非常具体的要求,我发现很难做,我需要找到并替换文件中的某些行,但问题是文本不同,唯一的好处是它们都有。[扩展名]

例如:

30/07/2012  14:46            17,232 training program.DOCX.ddkhqvh
08/03/2011  20:57            31,664 nutritional program.XLS.ddkhqvh

需要:

F:/home/training program.DOCX.ddkhqvh
F:/home/nutritional program.XLS.ddkhqvh

我试着用awk但是我把头发拉了出来。

4 个答案:

答案 0 :(得分:2)

这个怎么样:

$ awk '/^[0-9]+\/[0-9]+\/[0-9]+/ { sub(/^[^ ]+ +[^ ]+ +[^ ]+ +/,"F:/home/"); print; }' <file.txt
F:/home/ALLERGAN Recruitment tracking sheet Template.XLS.ddkhqvh
F:/home/Holding Letter 15May12.DOCX.ddkhqvh
F:/home/Amgen DBMS 2nd Mailing part 1 - Griifin Request Form.DOCX.ddkhqvh
F:/home/Amgen DBMS 2nd Mailing part 2 - Griifin Request Form.DOCX.ddkhqvh
F:/home/Database Letter, Reply Slip, 20070337, AMGXXXOST337,draft version 1, 19.03.12.DOC.ddkhqvh
F:/home/Previous DXA ladies 25.05.12.DOCX.ddkhqvh
F:/home/GP Letter, 20070337, Version 1, 16.02.12.DOC.ddkhqvh
F:/home/End of Study Thank You Letter, 20070337, AMGXXXOST337, Version 1, 16.02.12.DOC.ddkhqvh
F:/home/GP Letter, 20070337, AMGXXXOST337, Version 1, 16.02.12.DOC.ddkhqvh
F:/home/Interim Thank you letter, 20070337, AMGXXXOST337, Version 1, 16.02.12.DOC.ddkhqvh
F:/home/Welcome Letter,  20070337, AMGXXXOST337, Version 1, 16.02.12.DOC.ddkhqvh
F:/home/End of Study Thank You Letter,20070337, AMGXXXOST337, Version 1 Draft, 9th Feb 2012.DOC.ddkhqvh
F:/home/GP Letter,20070337, AMGXXXOST337, Version 1 Draft, 9th Feb 2012.DOC.ddkhqvh
F:/home/Interim Thank you letter,20070337, AMGXXXOST337, Version 1 Draft, 9th Feb 2012.DOC.ddkhqvh
F:/home/Welcome Letter, 20070337, AMGXXXOST337, Version 1 Draft, 9th Feb 2012.DOC.ddkhqvh
F:/home/End of Study Thank You Letter, 20070337, AMGXXXOST337, Version 1, 16.02.12.DOC.ddkhqvh
F:/home/example GPMS.DOC.ddkhqvh
F:/home/GP Letter, 20070337, AMGXXXOST337, Version 1, 16.02.12.DOC.ddkhqvh
F:/home/Interim Thank you letter, 20070337, AMGXXXOST337, Version 1, 16.02.12.DOC.ddkhqvh
F:/home/Welcome Letter,  20070337, AMGXXXOST337, Version 1, 16.02.12.DOC.ddkhqvh
F:/home/A5 EDUCATION LUNCH POSTERS - CAMPAIGN CODES.DOC.ddkhqvh
F:/home/Multiple choice Questionaire - Merseyside  26th Jan 2011.DOC.ddkhqvh
F:/home/Multiple choice Questionaire - Scotland 26th Jan 2011.DOC.ddkhqvh
F:/home/Multiple choice Questionaire - Wales  26th Jan 2011.DOC.ddkhqvh
F:/home/Multiple choice Questionaire Template  26th Jan 2011.DOC.ddkhqvh

这样只会获取文件中包含初始日期的行,因此只会修改文件中列出的文件名。

答案 1 :(得分:1)

这应该做:

awk '/\.[[:alpha:]]+$/ {$1=$2=$3="";sub(/^ */,"F:/home/");print}' file
F:/home/ALLERGAN Recruitment tracking sheet Template.XLS.ddkhqvh
F:/home/Holding Letter 15May12.DOCX.ddkhqvh
F:/home/Amgen DBMS 2nd Mailing part 1 - Griifin Request Form.DOCX.ddkhqvh
F:/home/Amgen DBMS 2nd Mailing part 2 - Griifin Request Form.DOCX.ddkhqvh
F:/home/Database Letter, Reply Slip, 20070337, AMGXXXOST337,draft version 1, 19.03.12.DOC.ddkhqvh
F:/home/Previous DXA ladies 25.05.12.DOCX.ddkhqvh
F:/home/GP Letter, 20070337, Version 1, 16.02.12.DOC.ddkhqvh
F:/home/End of Study Thank You Letter, 20070337, AMGXXXOST337, Version 1, 16.02.12.DOC.ddkhqvh
F:/home/GP Letter, 20070337, AMGXXXOST337, Version 1, 16.02.12.DOC.ddkhqvh
F:/home/Interim Thank you letter, 20070337, AMGXXXOST337, Version 1, 16.02.12.DOC.ddkhqvh
F:/home/Welcome Letter, 20070337, AMGXXXOST337, Version 1, 16.02.12.DOC.ddkhqvh
F:/home/End of Study Thank You Letter,20070337, AMGXXXOST337, Version 1 Draft, 9th Feb 2012.DOC.ddkhqvh
F:/home/GP Letter,20070337, AMGXXXOST337, Version 1 Draft, 9th Feb 2012.DOC.ddkhqvh
F:/home/Interim Thank you letter,20070337, AMGXXXOST337, Version 1 Draft, 9th Feb 2012.DOC.ddkhqvh
F:/home/Welcome Letter, 20070337, AMGXXXOST337, Version 1 Draft, 9th Feb 2012.DOC.ddkhqvh
F:/home/End of Study Thank You Letter, 20070337, AMGXXXOST337, Version 1, 16.02.12.DOC.ddkhqvh

如果行以.text结尾,则会更改路径。它删除了第一个三个字段并添加了路径。

答案 2 :(得分:0)

awk '{print "f:/home/"$(NF-1), $(NF)}' filename.txt

你可以尝试这个。 它将最后两个字段(与空格分开)附加到预定义字符串。

答案 3 :(得分:0)

如何使用cutsed

$ cat spam
30/07/2012  14:46            17,232 training program.DOCX.ddkhqvh
08/03/2011  20:57            31,664 nutritional program.XLS.ddkhqvh

$ cut -c 37- spam | sed 's/^/F:\/home\//'
F:/home/training program.DOCX.ddkhqvh
F:/home/nutritional program.XLS.ddkhqvh

只要原始文件的文件名从第37个字符开始,它就会起作用。

如果您希望将结果放在其他文件中,只需使用>

重定向输出
$ cut -c 37- spam | sed 's/^/F:\/home\//' > output

修改

如果您的初始文件列表来自在MS Windows中发出dir >your_file命令,则只需使用dir /B >your_file代替dir即可获取的文件列表任何其他列,如大小,日期,所有者等...然后只需在Linux shell中发出以下命令,将文件夹添加到每行的开头:sed 's/^/F:\/home\//' your_file