Linux 将合并行批处理脚本转换为shell

Linux 将合并行批处理脚本转换为shell,linux,bash,shell,unix,Linux,Bash,Shell,Unix,我最近在同一个论坛上问了一个问题,并找到了解决办法。不幸的是,它必须转换为UNIX。问题是合并csv文件中的行。每行应以分号结尾;如果它在再次找到分号之前没有将下一行合并到它中 对我有效的解决方案是 @echo off setlocal disableDelayedExpansion set "ln=" for /f delims^=^ eol^= %%i in (myfile.txt) do ( set "var=%%i" setlocal enableDelayedExpan

我最近在同一个论坛上问了一个问题,并找到了解决办法。不幸的是,它必须转换为UNIX。问题是合并csv文件中的行。每行应以分号结尾;如果它在再次找到分号之前没有将下一行合并到它中

对我有效的解决方案是

@echo off
setlocal disableDelayedExpansion
set "ln="
for /f delims^=^ eol^= %%i in (myfile.txt) do (
    set "var=%%i"
    setlocal enableDelayedExpansion
    if "!var:~-1!"==";" (echo !var!>>temp.csv) else (<nul set /p ="!var!">>temp.csv)
    endlocal
)
是否可以转换为UNIX脚本


指向原始帖子的链接是:

下次如果要进行文本处理,请不要转到windows:D

鉴于你有:

A;1;abc;<xml/>;
;2;def;<xml
>hello world</xml>;
;3;ghi;<xml/>;
试验

在这种情况下,它也起作用:

kent$  cat ttt
A;1;abc;<xml/>;
;2;def;<xml
>h
e
l
l
o w
o
rld<
/xm
l>;
;3;ghi;<xml/>;

kent$  awk '!/;$/{l=l""$0;next;}{print l""$0;l=""}' ttt
A;1;abc;<xml/>;
;2;def;<xml>hello world</xml>;
;3;ghi;<xml/>;

sed将是我的选择

sed ':a;/[^;]$/{N;s/\n//;ta}' x.txt 
sed读取每一行和每一行的内容 设置标记:a 然后检查线路是否丢失了数据/[^;]$/ 如果它没有;N读入下一行并将其附加到当前行,并用新行分隔它们。 s/\n//删除换行符
ta检查替换是否成功,如果成功,则跳转到:a标记以再次开始检查

是的,这是可能的。你试过什么?没有Unix脚本这样的东西。有脚本语言、shell、管道实用程序和多种编程语言。做一些研究并编写一些代码,这样你就能更好地提出好的堆栈溢出问题。谢谢@Kent。由于我的CSV文件的每一行都相当大,因此我得到了一个关于数据大小的错误。我发现我可能需要使用perl。可以在perl中使用相同的正则表达式吗?谢谢@peteches。由于我的CSV文件的每一行都相当大,因此我得到了一个关于数据大小的错误。我发现我可能需要使用perl。可以将同一个正则表达式与perl一起使用吗?
kent$  cat ttt
A;1;abc;<xml/>;
;2;def;<xml
>h
e
l
l
o w
o
rld<
/xm
l>;
;3;ghi;<xml/>;

kent$  awk '!/;$/{l=l""$0;next;}{print l""$0;l=""}' ttt
A;1;abc;<xml/>;
;2;def;<xml>hello world</xml>;
;3;ghi;<xml/>;
sed ':a;/[^;]$/{N;s/\n//;ta}' x.txt