一个答案另一个问题建议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 行编辑器了解详情。