awk 或 sed 命令替换换行符和包含空格的文本

awk 或 sed 命令替换换行符和包含空格的文本

一个答案另一个问题建议sed -i 's/original/replacement/g' file.txt替换文本文件中的特定单词。我的起始情况如下:

        Item: PRF
        Type: File
        Item: AOX
        Type: Folder
        Item: DD4
        Type: File

我的最终情况应该是这样的:

        Item: PRF^Type: File
        Item: AOX^Type: Folder
        Item: DD4^Type: File

注意:(1) Ask Ubuntu 界面似乎隐藏了 Item: 和 Type: 前面的一些前导空格。实际上有八个前导空格。(2) 我可能在使用过于简单的 Item 示例时犯了错误。这些项目实际上是部分 Windows 路径(例如缺少 D:),其中一些相当长。更准确的例子是 Item: Folder\Some Folder\A file name.txt。

我已经尝试过这个,带和不带双引号:

sed -i 's/\n"        Type: "/\^"Type: "/g' file.txt

这不会给我带来任何错误,但也不会带来任何变化。还尝试了以下方法:

awk '/ "        Item: " / { printf "%s", $0"^" } / "        Type: " / { gsub(/^[ \t]+/,"",$0); print $0 }' source.txt

我尝试这样做是为了验证我只会更改“Item”之前有八个空格的条目。但没成功。尝试不带空格和双引号,如下面的答案所示,也失败了。尝试生成gawk -i inplace包含零字节的 source.txt。

我的标题最初指定了sed。 建议的答案awk提醒我注意该替代方案,该替代方案(现在我正在查看)似乎更强大。 但我不知道如何让它工作。

答案1

我会用awk…它是一行简单易懂的语句,如下:

awk '/Item:/ { printf "%s", $0"^" } /Type:/ { gsub(/^[ \t]+/,"",$0); print $0 }' file

也就是说...如果该行包含Item:以下内容,则打印它而不添加换行符(printf默认情况下不添加换行符)但^在末尾附加字符……并且如果该行包含该字符Type:,则删除所有前导空格并打印并附加换行符(print默认添加换行符)。

上述命令不会修改原始文件,而是在终端输出修改后的文本。

编辑原始文件就地,使用-i inplace选项GNUawk可能是 Ubuntu 上的默认设置...检查awk -W version)如果没有,你可以安装gawk然后像这样使用它:

gawk -i inplace '/Item:/ { printf "%s", $0"^" } /Type:/ { gsub(/^[ \t]+/,"",$0); print $0 }' file

答案2

默认情况下,sed 每次只将一行加载到其模式空间中。您可以使用该N命令加载另一行。

实际上,您的问题是一个众所周知的“单行”的变体,用于根据以下第1行的首字符连接行:

40. 如果一行以等号“=”开头,则将该行附加到上一行。

sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'

因此

$ cat file.txt
    Item: PRF
    Type: File
    Item: AOX
    Type: Folder
    Item: DD4
    Type: File

(有 4 个初始空格),则

$ sed -E -e :a -e '$!N;s/\n {4}Type: (File|Folder)/^Type: \1/; ta' -e 'P;D' file.txt
    Item: PRF^Type: File
    Item: AOX^Type: Folder
    Item: DD4^Type: File

一旦您对它正在做的事情感到满意,就可以添加-i-i.bak编辑该文件。


或者,您可以使用以下非流式ed编辑器脚本来匹配行Type:,替换^前导空格,然后oin 到上一行,将结果写回到同一个文件:

g/^ \{4\}Type:/s//^Type:/\
-1,.j
wq

您可以将其作为非交互式 shell 单行程序实现:

printf '%s\n' 'g/^ \{4\}Type:/s//^Type:/\' '-1,.j' 'wq' | ed -s file.txt

GNU ed 行编辑器了解详情。


  1. 例如Sed 单行命令详解,第一部分:文件间距、编号和文本转换与替换

相关内容