如何用sed命令往空文件中写入数据

朋友碰到个难题,就是用sed命令往空文件末尾中写入数据,数据来自一个变量,怎么都添加不成功,然后问我要如何处理。仔细想了下,如果文件为非空的话,使用sed命令是可以搞定的,命令如下:
sed -i '$a\要插入的文字' file.txt
i    # 直接修改文件。

$    # 匹配文件的最后一行位置

a    # 命令在后面append

但如果是空的话,上面的命令就搞不定了!为什么呢? 因为sed是基于行来处理的文件流编辑器,如果文件为空的话,它是处理不了的!找了段英文的解释如下:

Sed  is  a  stream  editor.   A stream editor is used to perform basic text transformations on an input stream (a file or input from a
       pipeline).  While in some ways similar to an editor which permits scripted edits (such as ed), sed works by making only one pass  over
       the  input(s),  and  is  consequently more efficient.  But it is sed’s ability to filter text in a pipeline which particularly distin-
       guishes it from other types of editors.

大致情形就是:

linux@host~# cat file.txt                // 里面没有内容
linux@host~# touch file.txt              // 新建一个空文件
linux@host~# cat file.txt                // 里面没有内容
linux@host~# sed -i "\$a $var" file.txt  // 往文件里面添加变量中的数据
linux@host~# cat file.txt                // 但文件里面还是没有内容
linux@host~#
那么这种情形要如何处理呢?可以加个判断,如果文件存在但为空的话,使用echo命令来添加,如果非空的话,则使用sed命令,所以完整的测试应该这样:

文件为空

# var变量中的内容
$ var='append new context'
# 新建一个空文件
$ touch file.txt
# 文件内容为空
$ cat file.txt
$
# 判断文件是否为空,空则使用echo命令添加,非空则使用sed命令
$ test -s file.txt && sed -i "\$a $var" file.txt || echo "$var" >> file.txt
$ cat file.txt
append new context
文件非空

linux@host~# cat file.txt
This is line 1.
This is line 2.
linux@host~# test -s file.txt && sed -i "\$a $var" file.txt || echo "$var" >> file.txt
linux@host~# cat file.txt
This is line 1.
This is line 2.
append new context
从上面来看,问题得到完美的解决!


  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 在 PowerShell ,可以使用 `Select-String` 命令来实现类似于 Unix `sed` 命令的功能。以下是一些例子: 1. 将文件的某个字符串替换为另一个字符串: ```powershell (Get-Content file.txt) | ForEach-Object { $_ -replace 'old_string', 'new_string' } | Set-Content file.txt ``` 其,`file.txt` 是要处理的文件名,`old_string` 是要替换的字符串,`new_string` 是替换后的字符串。 2. 删除文件的某个字符串: ```powershell (Get-Content file.txt) | ForEach-Object { $_ -replace 'string_to_delete', '' } | Set-Content file.txt ``` 其,`string_to_delete` 是要删除的字符串。 3. 在文件的某个位置插入一行内容: ```powershell (Get-Content file.txt) | ForEach-Object { $_; if ($_ -match 'insert_after_this_line') { 'new_line_to_insert' } } | Set-Content file.txt ``` 其,`insert_after_this_line` 是要在其后面插入新行的那一行的字符串,`new_line_to_insert` 是要插入的新行的内容。 注意,在 PowerShell ,管道符 `|` 的作用类似于 Unix 的管道符,可以将前一个命令的输出作为后一个命令的输入。而在 Unix ,`sed` 命令通常用于文本流的过滤和转换,可以直接从标准输入或者文件读取数据,并将处理结果输出到标准输出或者文件。因此,在 PowerShell ,需要先读取文件内容,然后对其进行处理,最后再将处理结果写入文件。 ### 回答2: PowerShell是一种功能强大的脚本语言和命令行工具,用于管理和自动化Windows操作系统。它包含了许多内置命令和功能,其没有直接的sed命令sed命令是在类Unix系统常用的流编辑器,用于处理文本文件。 虽然PowerShell没有内置的sed命令,但可以使用其他命令和功能来实现类似的功能。以下是一些可以在PowerShell替代sed命令的常用方法: 1. 使用正则表达式替换:PowerShell的 `-replace` 运算符可以使用正则表达式来替换文本。例如,可以使用以下命令替换文本文件的所有"foo"为"bar": ```powershell (Get-Content file.txt) -replace 'foo', 'bar' | Set-Content file.txt ``` 2. 使用`Select-String`命令:`Select-String`命令可以找到字符串匹配的文本行,并可以使用`-replace`参数进行替换。以下命令文件的"foo"替换为"bar": ```powershell (Get-Content file.txt) | ForEach-Object { $_ -replace 'foo', 'bar' } | Set-Content file.txt ``` 3. 使用`Get-Content`和`Set-Content`命令:如果不需要基于正则表达式进行替换,可以使用`Get-Content`读取文件内容,然后使用`Set-Content`写回修改后的内容。以下命令文件的"foo"替换为"bar": ```powershell $content = Get-Content file.txt $content = $content -replace 'foo', 'bar' $content | Set-Content file.txt ``` 总之,PowerShell可以使用一些内置的命令和功能来达到类似于sed命令的功能。它提供了灵活性和强大的文本处理能力,使得在Windows环境下进行文本处理变得更加容易和便捷。 ### 回答3: Powershellsed命令是用来在文本执行模式匹配和替换操作的工具。Sed是一个强大的文本处理工具,可以通过正则表达式匹配和替换文本的内容。 在Powershell,可以使用`-replace`操作符来实现类似sed命令的功能。`-replace`操作符可以接受一个正则表达式模式和一个替换字符串,从而实现对文本的替换。以下是一个简单的示例: ```powershell $content = "Hello, World!" $newContent = $content -replace "Hello", "Hi" Write-Output $newContent ``` 以上示例,我们将`$content`变量的内容从`Hello`替换为`Hi`,然后通过`Write-Output`输出新的内容。运行该脚本,将会输出`Hi, World!`。 除了简单的替换,`-replace`操作符还支持正则表达式的使用,可以通过正则表达式进行模式匹配和替换。例如,我们可以使用正则表达式来匹配名字的所有数字并替换为空字符串: ```powershell $name = "John123Doe" $newName = $name -replace '\d', '' Write-Output $newName ``` 以上示例,我们使用`'\d'`的正则表达式模式匹配字符串`John123Doe`的所有数字,并将其替换为空字符串。运行该脚本,将会输出`JohnDoe`。 因此,虽然Powershell没有一个直接等效于sed命令命令,但使用`-replace`操作符可以实现类似的功能,实现文本的模式匹配和替换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值