0

我需要在 Linux 中逐行读取文件,在每一行中找到一个子字符串,将其删除并将其放在该行的末尾。

例子:

原始文件中的行:

a,b,c,substring,d,e,f

输出文件中的行:

a,b,c,d,e,f,substring

如何使用 Linux 命令执行此操作?谢谢!

4

2 回答 2

3
sed '/substring/{ s///; s/$/substring/;} '

将处理固定的子字符串。请注意,如果 substring 以 a 开头,则,可以很好地处理您的示例情况。如果子字符串不固定但可能是通用正则表达式:

sed 's/\(substring\)\(.*\)/\2\1'

如果您正在寻找一般的 csv 解析,您应该重新表述这个问题。(如果您将输入视为逗号分隔的字段,则很难应用此解决方案在行首找到固定字符串。)

于 2012-09-09T13:44:25.777 回答
0

我总是喜欢使用 perl 的命令行来执行这样的正则表达式任务 - perl 足够强大,可以在我的大多数用法中涵盖 awk 和 sed,并且在 windows 和 linux 中都可用,它对我来说既简单又方便,所以解决方案在perl 就像:

perl -ne "s/^(.*?)(?:(?<comma>,)(?<substr>substring)|(?<substr>substring)(?<comma>,))(?<right>.*)$/$1$+{right}$+{comma}$+{substr}/; print" input.txt > output.txt

或更简单的:

perl -lpe "if(s/(,substring|substring,)//){ s/$/,substring/ }" input.txt > output.txt

输入.txt

substring,a,b,c,d,e,f
a,b,c,substring,d,e,f
a,b,c,d,e,f,substring
substring,a
a,substring
substring
a

输出.txt

a,b,c,d,e,f,子串
a,b,c,d,e,f,子串
a,b,c,d,e,f,子串
a,子串
a,子串 子

a

您可以根据实际输入进行编辑:

  • 如果单词和逗号之间有空格
  • 如果您使用制表符作为分隔符

命令行的一些解释:

  • 使用 perl 的 -n -e 选项: -n 表示在循环中逐行处理输入;-e 表示命令行中的一行程序
  • 使用 perl 的 -l -p 选项: -l 表示处理多行;-p 表示总是打印
  • 单行程序只是正则表达式替换和打印
  • (?:pattern) 表示分组但不捕获匹配项
  • (?<comma>) 是一个命名组,然后您需要使用 $+{comma} 哈希来访问它
于 2012-09-09T14:43:31.117 回答