Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Linux脚本解析每一行,检查正则表达式并修改该行_Regex_Linux_Bash_Shell_Csv - Fatal编程技术网

Regex Linux脚本解析每一行,检查正则表达式并修改该行

Regex Linux脚本解析每一行,检查正则表达式并修改该行,regex,linux,bash,shell,csv,Regex,Linux,Bash,Shell,Csv,我正在尝试编写一个linux bash脚本,该脚本将输入一个csv文件,其中的行以以下格式写入(某些内容可能为空): 我必须将以下格式作为输出(如果行包含,则必须将substring1、substring2中的两个子字符串分开,并删除一个、字符,否则什么也不做) 我试图解析文件的每一行并检查它是否遵守正则表达式,但该命令启动了一个永无止境的循环(不知道为什么),morevor不知道如何将子字符串分割为输出子字符串1、子字符串2 for f in /filepath/filename.csv do

我正在尝试编写一个linux bash脚本,该脚本将输入一个csv文件,其中的行以以下格式写入(某些内容可能为空):

我必须将以下格式作为输出(如果行包含
,则必须将substring1、substring2中的两个子字符串分开,并删除一个
字符,否则什么也不做)

我试图解析文件的每一行并检查它是否遵守正则表达式,但该命令启动了一个永无止境的循环(不知道为什么),morevor不知道如何将子字符串分割为输出子字符串1、子字符串2

for f in /filepath/filename.csv
do
            while read p; do
            if [[$p == .\..]] ; then echo $p; fi
            done <$f
done
用于/filepath/filename.csv中的f
做
读p;做
如果[$p=.\..];然后echo$p;fi

完成目前我无法为您提供有效的代码,但有一条快速建议: 1.尝试使用名为sed的工具
2.了解regex的“捕获组”,以获取如何基于表达式分割文本的信息。

分离字符串AWK将非常有用

    echo "Hello.world" | awk -F"." '{print "STR1="$1", STR2="$2 }'

希望它能有所帮助。

由于您的任务更多的是转换不相关的文本行,而不是解析csv格式文件的字段,
sed
确实是一个可以使用的工具

学习正确地使用sed,即使是最基本的任务,也是学习正则表达式的同义词。以下调用
sed
命令可将输入样本转换为预期输出:

sed 's/\.\([^,]*\),/,\1/g' input.csv >output.csv
在上面的示例中,
s//
是替换命令。 从手册页:

s/regexp/replacement/

尝试将regexp与模式空间匹配。如果成功, 替换与替换匹配的部分。[……]


解释regexp和替换上述命令可能超出了问题的范围,因此我将在这里完成我的回答。。。希望有帮助

好的,我设法使用了regexp,但是下面的命令似乎不再起作用了:

sed '\([^,]*\),\([^,]*\)\.\([^,]*\),,\([^,]*\),\([^,]*\),\([^,]*\),\([^,]*\),\([^,]*\),\([^,]*\),\([^,]*\),\([^,]*\),\([^,]*\),/\1,\2,\3,\4,\5,\6,\7,\8,\9,\10,\11,\12,'

sed:-e表达式#1,char 125:未知命令:`\'

您的输入不包含点,并且您的预期输出与输入相同
sed 's/\.\([^,]*\),/,\1/g' input.csv >output.csv
sed '\([^,]*\),\([^,]*\)\.\([^,]*\),,\([^,]*\),\([^,]*\),\([^,]*\),\([^,]*\),\([^,]*\),\([^,]*\),\([^,]*\),\([^,]*\),\([^,]*\),/\1,\2,\3,\4,\5,\6,\7,\8,\9,\10,\11,\12,'