首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用shell在文件中查找和替换换行符和单词

使用shell在文件中查找和替换换行符和单词
EN

Stack Overflow用户
提问于 2020-09-26 18:56:17
回答 4查看 81关注 0票数 1

我有一个文件sample.txt,它的内容是

代码语言:javascript
复制
line-1
Generic-text-1 line-2
Generic-text-2 line-3
line-2
Generic-text-1 line-2
Generic-text-2 line-3

我希望将文件的内容更改为CSV,以便如下所示进行内容转换。

代码语言:javascript
复制
line-1,line-2,line-3
line-2,line-2,line-3

我正在尝试使用sed命令,但无法使用换行符。

代码语言:javascript
复制
sed -i 's/\nGeneric-text-1/,/g' sample.txt
sed -i 's/\nGeneric-text-2/,/g' sample.txt

提前感谢

EN

回答 4

Stack Overflow用户

发布于 2020-09-26 20:27:37

这可能适用于您(GNU sed):

代码语言:javascript
复制
sed -E ':a;$!N;s/\n\S+\s/,/;ta;P;D' file

收集行,将换行符、第一个字段及其分隔符替换为逗号。当匹配失败时,打印第一行,删除它,然后重复。

更详细的解释:

  • -E命令行选项扩展了正则表达式。在这种情况下,允许速记\+.
  • :a而不是+是一个占位符a,它允许在此时继续执行sed命令(与ta +一起使用,只要当前行不是文件$!中的最后一行,就将下一行N附加到模式空间中的当前行。模式空间是sed命令在其上的缓冲区executed.
  • s/\n\S+\s/,/是替换命令,在该替换命令中,将替换新行的匹配,后跟一个或多个非空格字符,后跟一个空白字符,即,在附加行的开始处的单词,后跟至少一个space.
  • ta。如果替换成功,则将代码执行跳到占位符a,即,在这一点上返回最后一个替换的后退2秒失败,并且此操作打印到并包括模式space.
  • D中的第一个换行符,这将删除模式空间中的第一个换行符。但是,与重新启动sed循环并将下一行读入模式空间的d命令不同,此命令仅在当前模式空间为空时才执行此操作。如果它包含值,则从第一个sed命令恢复,在本例中为命令:a.

因此,sed程序会蚕食该文件,创建并打印/删除自己创建的行。

或者在紧要关头:

代码语言:javascript
复制
sed -z 's/\n\S\+ /,/g' file

或者:

代码语言:javascript
复制
awk '{gsub(/\n\S+ /,",")}1' RS= file
票数 4
EN

Stack Overflow用户

发布于 2020-09-26 20:38:55

使用awk,您可以执行以下操作:

代码语言:javascript
复制
awk -v OFS=, 'NF > 1 {
   printf "%s", OFS $NF
}
NF == 1 {
   if (NR>1)
      print ""
   printf "%s", $1
}
END {
   print ""
}' file
代码语言:javascript
复制
line-1,line-2,line-3
line-2,line-2,line-3
票数 1
EN

Stack Overflow用户

发布于 2020-09-26 21:26:00

您可以尝试使用GNU awk编写和测试下面的示例吗?

代码语言:javascript
复制
awk '
BEGIN{ OFS="," }
/^line/{
  if(val){
    print val
  }
  val=$1
  next
}
{
  val=(val?val OFS:"")$NF
}
END{
  if(val){
     print val
  }
}' Input_file
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64076813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档