Bash 删除分词字符的Sed脚本

Bash 删除分词字符的Sed脚本,bash,shell,sed,Bash,Shell,Sed,在这种情况下,长文本行被分成多行,并带有=字符。我认为像sed的//$//g’old file>new file或sed的//\=$//g’old file>new file这样的简单sed脚本可以解决这个问题。然而,这个sed命令并没有像我期望的那样重新组合分解的文本行 例如,如果旧文件的内容为: I wonder who came up with the phrase A qu= ick brown fox jumps over the lazy dog. 我希望新文件的内容是: I

在这种情况下,长文本行被分成多行,并带有=字符。我认为像sed的//$//g’old file>new file或sed的//\=$//g’old file>new file这样的简单sed脚本可以解决这个问题。然而,这个sed命令并没有像我期望的那样重新组合分解的文本行

例如,如果旧文件的内容为:

I wonder who came up with the phrase A qu=
ick brown fox jumps over the lazy dog.  
我希望新文件的内容是:

I wonder who came up with the phrase A quick brown fox jumps over the lazy dog.
Q如果一行文本中的尾随字符表示它是分词字符,那么从该行文本中删除该字符的最佳方法是什么

cat old-file | tr '-' ' ' > new-file
我故意使用破折号作为回车的tr锚点;tr是我所知道的唯一一个可以让我轻松插入它们的实用程序。据我所知,几乎所有其他工具都很难使用。这可以用ed完成,但不能优雅地完成

cat oldfile | tr '-' '\n' > newfile
能够拆分行非常有用,因为行号比正则表达式更容易处理。我可以使用ed来获得单独的行号,而ed中的相对+/-数字寻址意味着我仍然可以在文件上下爬升并进行逐行盲搜索,即使我不知道我想要的确切数字,并且如果为整个文件制作多模式正则表达式太难的话

我故意使用破折号作为回车的tr锚点;tr是我所知道的唯一一个可以让我轻松插入它们的实用程序。据我所知,几乎所有其他工具都很难使用。这可以用ed完成,但不能优雅地完成

cat oldfile | tr '-' '\n' > newfile
能够拆分行非常有用,因为行号比正则表达式更容易处理。我可以使用ed获得单独的行号,而ed中的相对+/-数字寻址意味着我仍然可以在文件上下爬升并进行逐行盲搜索,即使我不知道所需的确切数字,并且为整个文件制作多模式正则表达式太难。

sed在单行上工作。它在每个周期向内存加载一行。要加载更多,您必须使用sed命令来完成

有了GNU sed和足够的内存,您可以替换=及其后面的换行符:

否则,必须将下一行追加到模式空间。循环直到最后找到a=为止,我认为:

sed ': again; /=$/{ s///;N;s/\n//;b again; }'
sed在单线上工作。它在每个周期向内存加载一行。要加载更多,您必须使用sed命令来完成

有了GNU sed和足够的内存,您可以替换=及其后面的换行符:

否则,必须将下一行追加到模式空间。循环直到最后找到a=为止,我认为:

sed ': again; /=$/{ s///;N;s/\n//;b again; }'

这可能适用于GNU sed:

sed ':a;N;s/=\n//;ta;P;D' file
在整个文件长度上打开一个两行窗口

如果第一行以=结尾,则删除它和换行符并重复


否则,请打印,然后删除第一行并重复。

这可能适用于GNU-sed:

sed ':a;N;s/=\n//;ta;P;D' file
在整个文件长度上打开一个两行窗口

如果第一行以=结尾,则删除它和换行符并重复


否则,请先打印,然后删除第一行并重复。

好的,我搜索了几个小时,并尝试使用正则表达式执行此操作,但遇到挫折,转到二进制级别:

cat文件| xxd-p | sed's/3d0a//g'| xxd-p-r

结果脚本:我知道这不是printf的正确用法,修复了这个问题

#!/bin/bash

while IFS= read -r line; do
  DATASTREAM=`printf '%s\n' "$line"`
  STRING_DATA=`echo "$STRING_DATA\n$DATASTREAM"`
done

echo -e `echo $STRING_DATA | xxd -p | sed 's/3d0a//g' | xxd -p -r`


好吧,我搜索了几个小时,试着用正则表达式来做,但遇到了挫折,进入了二进制级别:

cat文件| xxd-p | sed's/3d0a//g'| xxd-p-r

结果脚本:我知道这不是printf的正确用法,修复了这个问题

#!/bin/bash

while IFS= read -r line; do
  DATASTREAM=`printf '%s\n' "$line"`
  STRING_DATA=`echo "$STRING_DATA\n$DATASTREAM"`
done

echo -e `echo $STRING_DATA | xxd -p | sed 's/3d0a//g' | xxd -p -r`

一个简单的awk解决方案是将记录分隔符设置为=\n,将输出记录分隔符设置为空,然后打印

awk -v RS="=\n" -v ORS="" '1' file

一个简单的awk解决方案是将记录分隔符设置为=\n,将输出记录分隔符设置为空,然后打印

awk -v RS="=\n" -v ORS="" '1' file


您还需要删除=”之后的换行符。此sed命令只是没有按照我期望的方式重新组合分解的文本行。请解释一下,您希望它以什么方式重新组合分解的文本行???请发布一些您想要的示例输入和输出。@KamilCuk,我已经提供了您要求的示例。您还需要删除=”后的换行符。此sed命令只是没有按照我所期望的方式重新组合分解的文本行。请解释您希望它以什么方式重新组合分解的文本行???请发布一些您想要的示例输入和输出。@KamilCuk,我已经提供了您要求的示例。不应该再次使用吗/=$/{N;s/=\N/;t}'?也可以工作。我不喜欢t-您的代码将再次与b相同。我想我不想重复=模式两次,所以使用了s///一次替换vs两次;我希望有一个,然后重新键入=。-仔细想想,t可以让您将标签移到括号内,这看起来更漂亮:sed'/=$/{:a;N;s/=\N/;t a}我希望是on
e和retype=当模式存储在变量中时,如果在重构的情况下在sed源代码中列出一次,那么在长脚本中有时会更容易。我通常会这样做:sed'/'$var'/{s//;…..t允许移动是的,但它的行为与多个s命令的行为是违反直觉的。如果当前周期中的任何s命令成功,则t将跳转。在使用多个s命令的较长sed脚本中,它总是会出错。确切地说,这看起来稍微好一点,在文件.ex.'a=\nb\nc=\nd'L中存在多个=\n模式的情况下,这将不起作用ike sed'/=$/{:a;N;s/=\N/;ta}'确实显示了t出错的原因。t在s/=\n//失败的最后一行跳了太多次,然后t将跳到a,因为前面的任何s命令在当前循环中成功。然后它将读取太多行,并在下一行后退出,因为当前循环中的最后一个t失败。即,t不是if。请尝试echo-e'a=\nb\nc=\nd'| sed“//$/{:a;N;s//=\N//;ta}”好吧,除非在这种情况下OP不在乎,他只有一条长的线,那很好,但我认为不是。这不应该被sed:“;再次;//$/{N;s//=\N//;再次}”“?”也可以。我不喜欢t-你的代码对b也同样有效。我想我不想重复=模式两次,所以使用了s/////一次替换vs二次;我宁愿用一次替换,然后重新键入=。-想想看,t让你把标签移到括号内,这看起来有点漂亮:sed'/=$/{:a;N;s/=\N//;ta}'我宁愿有一个并重新键入=当模式存储在变量中时,如果在重构的情况下在sed源代码中列出一次,那么在长脚本中有时会更容易一些。我通常这样做:sed'/'$var'/{s//;…..t允许移动是的,但它的行为与多个s命令的行为是违反直觉的。如果当前周期中的任何s命令成功,则t将跳转。在使用多个s命令的较长sed脚本中,它总是会出错。确切地说,这看起来稍微好一点,在文件.ex.'a=\nb\nc=\nd'L中存在多个=\n模式的情况下,这将不起作用ike sed'/=$/{:a;N;s/=\N/;ta}'确实显示了t出错的原因。t在s/=\n//失败的最后一行跳了太多次,然后t将跳到a,因为前面的任何s命令在当前循环中成功。然后它将读取太多行,并在下一行后退出,因为当前循环中的最后一个t失败。即,t不是if。请尝试echo-e'a=\nb\nc=\nd'| sed'/=$/{:a;N;s/=\N/;ta}好吧,除非在这种情况下OP不在乎,他只有一行长的行,那没关系,但我认为没有。回显旧文件?你想要的是文件的内容,而不是名称……是的。我累了;现在我用cat替换了它,我会有人抱怨空格或其他什么,因为我没有使用读取。输入重定向,而不是无用的Cat!tr'-'''<旧文件>新文件的e也不确定用空格或换行符替换连字符将如何满足OP的要求…我们遇到了这样一种情况:长文本行被分成多行,并带有=字符。他的单词。用空格替换'='或在其前面返回的回车符,将重新加入行。回显旧文件?你知道吗想要文件的内容,而不是名称…是的。我累了;现在我用cat替换了它,我会有人抱怨空格或其他什么,因为我没有使用read。输入重定向,而不是无用地使用cat!tr'-'''new file也不确定用空格或换行符替换连字符将如何满足OP的要求s、 …我们遇到了这样一种情况,即长文本行被分成多行,并带有=字符。他的单词。用空格替换“=”或在其前面返回的回车符将重新连接这些行。