Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.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 如何重写文件并将非加工行移到上面。正则表达式_Regex_Powershell_Awk_Sed - Fatal编程技术网

Regex 如何重写文件并将非加工行移到上面。正则表达式

Regex 如何重写文件并将非加工行移到上面。正则表达式,regex,powershell,awk,sed,Regex,Powershell,Awk,Sed,我有一个文本文件,其中的行格式如下: 该行应始终以\\server\。。。并以提交结束 但是,正如您所看到的,有时线被分割并开始正常,但部分线被移动到新线 我需要用正确的格式把这个文件重写成一个新的。 基本上,如果行不是以\\server.开头。。然后应该将其添加到前一行。 我需要这方面的帮助-我可以在Windows powershell或Linux awk、sed上运行该工具。 提前感谢您使用以下功能的PowerShell解决方案: 通配符表达式\\server*匹配一个自包含的行,从以-结尾

我有一个文本文件,其中的行格式如下:

该行应始终以\\server\。。。并以提交结束 但是,正如您所看到的,有时线被分割并开始正常,但部分线被移动到新线

我需要用正确的格式把这个文件重写成一个新的。 基本上,如果行不是以\\server.开头。。然后应该将其添加到前一行。 我需要这方面的帮助-我可以在Windows powershell或Linux awk、sed上运行该工具。
提前感谢您

使用以下功能的PowerShell解决方案:

通配符表达式\\server*匹配一个自包含的行,从以-结尾的行推断,该行立即输出$\并继续处理下一行continue

通配符表达式\\server*,按消除过程匹配一个不完整的行,其内容保存在变量$prev中,然后再移动到下一行

默认处理程序默认值只对不完整行后面的行和完整行进行处理,字符串连接$prev+$\输出缝合在一起的两行

请注意,默认情况下,“设置内容”使用Windows PowerShell中系统活动ANSI代码页暗示的字符编码,以及PowerShell Core中不带BOM的UTF-8;使用-Encoding参数选择不同的编码。

如果行未以p结尾,则可以使用以下awk命令将当前行保存在p中,如果行以p开头,则可以打印以p开头的行:

awk '{if(/,"submitted"$/){print p?p" "$0:$0;p=""}else{p=$0}}' file

<> P>既然你在Windows上,我敢打赌中间线的断线只是\ns,而如果你从Excel中导出了一些包含断线的CSV,比如说:

,行结束是\r\ns。
$ cat -v file
"\\server\folder\file name dad dada dad","submitted"^M
"\\server\folder\file name dad dada xxx","submitted"^M
"\\server\folder\file name dad dada ttt","submitted"^M
"\\server\folder\file name dad dada rrr","submitted"^M
"\\server\folder\file name dad
dada ddd","submitted"^M
"\\server\folder\file name dad dada rrr","submitted"^M
在这种情况下,您只需将GNU awk用于多字符RS和RT:

$ awk -v RS='\r\n' '{$1=$1}1' file
"\\server\folder\file name dad dada dad","submitted"
"\\server\folder\file name dad dada xxx","submitted"
"\\server\folder\file name dad dada ttt","submitted"
"\\server\folder\file name dad dada rrr","submitted"
"\\server\folder\file name dad dada ddd","submitted"
"\\server\folder\file name dad dada rrr","submitted"
否则,您可能只需要:

$ awk -v RS='"\r?\n' '{ORS=RT;$1=$1}1' file
"\\server\folder\file name dad dada dad","submitted"
"\\server\folder\file name dad dada xxx","submitted"
"\\server\folder\file name dad dada ttt","submitted"
"\\server\folder\file name dad dada rrr","submitted"
"\\server\folder\file name dad dada ddd","submitted"
"\\server\folder\file name dad dada rrr","submitted"

如果您展示到目前为止您尝试过的代码,并描述您在使用它时遇到的问题,您将得到更友好的接待和更好的帮助。如果没有代码,您的问题看起来像是免费咨询的请求,这里的许多人不喜欢这样。欢迎来到!让你的问题尽可能容易回答意味着提供一个简单的答案。特别是,请包括您现在拥有的正则表达式,以及一些它不正确匹配或不正确匹配的示例。谢谢大家帮助我。我第一次尝试了@mklement0提出的解决方案,它成功了。当然。按照当时的建议更新。这是神圣的。我的意思是,我真的不知道你是怎么想到带通配符的开关的概念的+1谢谢,@RanadipDutta。是的,switch是一个功能强大的语句,它的功能并不广为人知,可能是因为其他语言中类似的语句很少。
$ awk -v RS='\r\n' '{$1=$1}1' file
"\\server\folder\file name dad dada dad","submitted"
"\\server\folder\file name dad dada xxx","submitted"
"\\server\folder\file name dad dada ttt","submitted"
"\\server\folder\file name dad dada rrr","submitted"
"\\server\folder\file name dad dada ddd","submitted"
"\\server\folder\file name dad dada rrr","submitted"
$ awk -v RS='"\r?\n' '{ORS=RT;$1=$1}1' file
"\\server\folder\file name dad dada dad","submitted"
"\\server\folder\file name dad dada xxx","submitted"
"\\server\folder\file name dad dada ttt","submitted"
"\\server\folder\file name dad dada rrr","submitted"
"\\server\folder\file name dad dada ddd","submitted"
"\\server\folder\file name dad dada rrr","submitted"