如何通过Shell脚本从文本文件复制指定内容至新文件?
嘿,我来帮你搞定这两个Shell操作的问题!下面分情况给你详细说明:
这里有几种常用且灵活的方法,按需选择就行:
使用
sed命令:
如果你明确知道要提取的是第N行(比如第5行),直接用这个命令:sed -n '5p' input.txt > output.txt解释下:
-n参数让sed只输出我们指定的内容,5p表示打印第5行,最后用>把结果写入新的output.txt文件。使用
head+tail组合:
这种方法逻辑很直观,先取前N行,再从这N行里取最后一行,就是目标行:head -n 5 input.txt | tail -n 1 > output.txt比如上面的命令就是提取第5行内容,写入新文件。
使用
awk命令:
awk里的NR代表当前行号,直接匹配行号就能打印对应内容:awk 'NR==5' input.txt > output.txt当行号等于5时,awk会自动打印该行,最后重定向到新文件即可。
你的文件内容是一行包含多段信息,要精准提取Address:后面的1234 Main St.,试试这几个方法:
使用
sed正则捕获:
用扩展正则表达式捕获目标内容,替换掉无关部分:sed -E 's/.*Address: (.*) SSN:.*/\1/' input.txt > output.txt解释:
-E参数启用扩展正则,.*Address:匹配到Address:之前的所有内容,(.*)捕获Address:到SSN:之间的地址内容,SSN:.*匹配SSN:之后的内容,最后用\1替换整行,只保留捕获的地址部分,写入新文件。使用
awk指定分隔符:
把Address:和SSN:设为字段分隔符,直接提取对应字段:awk -F 'Address: | SSN:' '{print $2}' input.txt > output.txt-F指定了两个可选的分隔符,这样整行被分成3部分,第2部分就是我们要的地址,打印后写入新文件。使用
grep的正向/反向预查:
如果你熟悉Perl风格正则,可以用grep的精准匹配:grep -oP '(?<=Address: ).*(?= SSN:)' input.txt > output.txt-o参数让grep只输出匹配的部分,(?<=Address: )是反向预查(确保前面是Address:),.*匹配地址内容,(?= SSN:)是正向预查(确保后面是SSN:),这样就能精准提取出目标地址啦。
内容的提问来源于stack exchange,提问作者Nikhilesh

