如何使用 SED 从文件中选择记录行

如何使用 SED 从文件中选择记录行

Apologies... Code that I shared earlier is incorrect, revising...

修改后的问题:

首先,我想为仓促道歉,我是 QSHELL 的新手,刚刚开始学习..但是我非常需要你的帮助,因为我需要尽快将以下内容集成到我的程序中..

基本上情况是,包含无效/特殊字符的文本文件被上传到我们的服务器中,我的程序必须在处理之前删除它们。

例如,我有 uploadfile.txt 它包含以下内容。

在此输入图像描述

为了替换特殊字符,我使用以下命令,它工作正常。

sed -e 's/[^a-zA-Z0-9&,-]/ /g' uploadfile.txt > outputfile.txt

  1. a to z小写 (az)
  2. A to Z大写 (AZ)
  3. 0-9
  4. &和符号
  5. ,逗号
  6. .时期

然而,在替换之前,我需要提取用于报告/通信目的的行,我不太确定如何并被卡住了...尝试搜索,但我仍然无法得到它,而且我已经没有时间了..

所以我的问题是,如何将行号 2、4、5 提取到单独的 text.file 中?

提前致谢。

这已经解决了,我按照@adminbee 在评论中的建议使用了以下命令。

sed -n '/[^[:print:]]/p' IFS/MM4R5FLR/S06013/myfile.POL > myfile.pol
谢谢大家的帮助。

答案1

如果两阶段方法可以,那么您可以首先grep将所有包含非法字符的行提取到文件中,然后使用sed命令进行实际替换。

请注意,由于您的目的是摆脱特殊(即“不可打印”字符),因此您可以尝试使用 POSIX 字符类[:print:]而不是枚举字符(如果您的grep/sed理解这些字符)。

所以,你可以先使用

grep '[^[:print:]]' uploadfile.txt > invalid_lines.txt

提取所有包含非法字符的行以用于存档目的,然后执行

sed -e 's/[^[:print:]]/ /g' uploadfile.txt > outputfile.txt

或者,如果您绝对确定,请通过以下方式执行就地编辑

sed -i -e 's/[^[:print:]]/ /g' uploadfile.txt

将它们从文件中清除。

答案2

来自sed 文档(“通过文本匹配选择行”),您可以同样选择行:

# First, report lines
sed -n '/[^a-zA-Z0-9&,-]/p' uploadfile.txt > reportfile.txt

# Then, correct and output text
sed -e 's/[^a-zA-Z0-9&,-]/ /g' uploadfile.txt > outputfile.txt

其中该-n选项只会输出“p”命令打印的内容,即由您的正则表达式选择的整行。

相关内容