我需要在 Linux 中逐行读取文件,在每一行中找到一个子字符串,将其删除并将其放在该行的末尾。
例子:
原始文件中的行:
a,b,c,substring,d,e,f
输出文件中的行:
a,b,c,d,e,f,substring
如何使用 Linux 命令执行此操作?谢谢!
sed '/substring/{ s///; s/$/substring/;} '
将处理固定的子字符串。请注意,如果 substring 以 a 开头,则,
可以很好地处理您的示例情况。如果子字符串不固定但可能是通用正则表达式:
sed 's/\(substring\)\(.*\)/\2\1'
如果您正在寻找一般的 csv 解析,您应该重新表述这个问题。(如果您将输入视为逗号分隔的字段,则很难应用此解决方案在行首找到固定字符串。)
我总是喜欢使用 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
您可以根据实际输入进行编辑:
命令行的一些解释: