用于查找子字符串并将其移动到行尾的linux命令

用于查找子字符串并将其移动到行尾的linux命令,linux,substring,edit,Linux,Substring,Edit,我需要在Linux中逐行读取一个文件,在每行中找到一个子字符串,将其删除并放置在该行的末尾 例如: 原始文件中的行: a,b,c,substring,d,e,f 输出文件中的第行: a,b,c,d,e,f,substring 如何使用Linux命令执行此操作?谢谢 sed '/substring/{ s///; s/$/substring/;} ' 将处理固定的子字符串。请注意,如果子字符串以,开头,则可以很好地处理示例案例。如果子字符串不是固定的,但可能是通用正则表达式: sed 's/

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

例如:

原始文件中的行:

a,b,c,substring,d,e,f
输出文件中的第行:

a,b,c,d,e,f,substring
如何使用Linux命令执行此操作?谢谢

sed '/substring/{ s///; s/$/substring/;} '
将处理固定的子字符串。请注意,如果子字符串以
开头,则可以很好地处理示例案例。如果子字符串不是固定的,但可能是通用正则表达式:

sed 's/\(substring\)\(.*\)/\2\1'
如果您正在寻找通用的csv解析,您应该重新措辞这个问题。(如果将输入视为逗号分隔的字段,则很难应用此解决方案在行首查找固定字符串。)

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

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
input.txt

子串a、b、c、d、e、f
a、 b,c,子串,d,e,f
a、 b、c、d、e、f、子串
子字符串,a
a、 子字符串
子字符串
a

output.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表示总是打印
  • 单行程序只是正则表达式的替换和打印
  • (?:模式)表示组,但不捕获匹配
  • (?)是一个命名组,然后需要使用$+{comma}散列来访问它

我总是喜欢使用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
input.txt

子串a、b、c、d、e、f
a、 b,c,子串,d,e,f
a、 b、c、d、e、f、子串
子字符串,a
a、 子字符串
子字符串
a

output.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表示总是打印
  • 单行程序只是正则表达式的替换和打印
  • (?:模式)表示组,但不捕获匹配
  • (?)是一个命名组,然后需要使用$+{comma}散列来访问它

它总是用逗号分隔吗?也可以用制表符分隔,我只是以.csv文件为例。在本例中,我将“substring”移到末尾。它是否总是用逗号分隔?也可以用制表符分隔,我只是以.csv文件为例。在本例中,我将“substring”移到末尾。我认为这不会处理示例字符串中的逗号。是否有一个通用问题的解决方案,例如指定分隔符(制表符、逗号、连续空格等),然后从第N个位置删除内容并插入到第M个位置?非常感谢为Linix新手推荐一本好书。我认为这不会处理示例字符串中的逗号。是否有一个通用问题的解决方案,如指定分隔符(制表符、逗号、连续空格等),然后从第N个位置删除内容并插入到第M个位置?为Linix新手推荐一本好书将不胜感激。