如何删除文件中某些行中的特定字符?

Posted

技术标签:

【中文标题】如何删除文件中某些行中的特定字符?【英文标题】:How can I remove specific characters in certain lines in a file? 【发布时间】:2021-09-12 20:41:58 【问题描述】:

如何从第 3 行的第 5 列到第 7 行剪切字符?

我正在尝试使用 sed/cut。

例如,如果我有

this is amazing1 this is amazing11
this is amazing2 this is amazing21
this is amazing3 this is amazing31
this is amazing4 this is amazing41
this is amazing5 this is amazing51
this is amazing6 this is amazing61
this is amazing7 this is amazing71

输出应如下所示:

this is amazing1 this is amazing11
this is amazing2 this is amazing21
this amazing3 this is amazing31
this amazing4 this is amazing41
this amazing5 this is amazing51
this amazing6 this is amazing61
this amazing7 this is amazing71

字符 is 从第 3 行及以后删除。

【问题讨论】:

edit 您的问题表明您尝试自己解决问题。见How to Ask。 您真的要剪切第 5-7 列,还是要剪切第二个以空格分隔的字段? 【参考方案1】:
sed -E '3,$s/(....).../\1/' file

【讨论】:

【参考方案2】:

为了清晰、可移植等,我只使用 awk:

$ awk 'NR>2$0=substr($0,1,4) substr($0,8) 1' file
this is amazing1 this is amazing11
this is amazing2 this is amazing21
this amazing3 this is amazing31
this amazing4 this is amazing41
this amazing5 this is amazing51
this amazing6 this is amazing61
this amazing7 this is amazing71

或使用您问题中的值填充的变量:

$ awk -v n=3 -v beg=5 -v end=7 'NR>=n$0=substr($0,1,beg-1) substr($0,end+1) 1' file
this is amazing1 this is amazing11
this is amazing2 this is amazing21
this amazing3 this is amazing31
this amazing4 this is amazing41
this amazing5 this is amazing51
this amazing6 this is amazing61
this amazing7 this is amazing71

【讨论】:

【参考方案3】:

分两步:

head -n2 infile; tail -n+3 infile | cut --complement -c5-7

第一个命令打印前两行未修改;第二个命令将从第三个开始的行通过管道传输到cut,其中删除了字符 5 到 7(需要 GNU cut)。

如果你需要对输出做一些事情,比如将它存储在一个文件中,你必须在重定向之前对这些命令进行分组:


    head -n2 infile
    tail -n+3 infile | cut --complement -c5-7
 > outfile

【讨论】:

【参考方案4】:

如果你想使用sed:

sed '1,2!s/^\(\w*\)\s*\w*\(.*\)$/\1\2/' file

详情

1,2!s - 不要在第 1 行和第 2 行进行替换。 /^\(\w*\)\s*\w*\(.*\)$/ - 匹配模式。 /\1\2/ - 恢复组 1 和 2。 file - 你的输入文件。

【讨论】:

以上是关于如何删除文件中某些行中的特定字符?的主要内容,如果未能解决你的问题,请参考以下文章

如何从数据框列的某些行中删除字符?

如何用BAT删除文件名中特定的几个字?

如何批量删除文件名中的一段?

如何在以前读过的行中找到一些单词并在输出中删除它 - C++ 中的读/写字符串

Xamarin:如何删除网格中特定行中的项目

如何使用 vbscript 删除 XML 文件中的特定节点