用于查找子字符串并将其移动到行尾的linux命令
我需要在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/
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、fa、 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 -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、fa、 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}散列来访问它