从STDIN读取,执行命令,然后在Bash中输出到STDOUT

时间:2015-04-11 01:21:12

标签: linux bash shell sed

我需要:

  • 从管道中接受我脚本中的STDIN

  • 将其保存到临时文件,以便我不修改原始资源

  • 对临时文件执行操作以生成一些输出

  • 输出到STDOUT

这是我的剧本:

#!/bin/bash

temp=$(cat)

sed 's/the/THE/g' <temp

echo "$temp"

现在,我只是想让它能够用“THE”取代所有出现的“the”。

以下是示例文本:

the quick brown fox jumped over the lazy

brown dog the quick

brown fox jumped

over

这是我的命令行:

cat test.txt | ./hwscript >hwscriptout

“test.txt”包含示例文本,“hwscript”是脚本,“hwscriptout”是输出

然而,当我查看输出文件时,没有任何改变(所有出现的“the”仍然没有资本化)。当我在命令行而不是脚本上执行sed命令时,它可以工作。我也尝试使用$(sed)而不是sed但是当我这样做时,命令返回了一个错误:

“./ hwscript:第5行:s / the / THE / g:没有这样的文件或目录”

我曾尝试搜索解决方案但找不到解决方案。

非常感谢帮助,谢谢。

3 个答案:

答案 0 :(得分:2)

  

将其保存到临时文件,以便我不修改原始源

通过stdin收到的任何内容都只是数据流,与其来源无关:无论您对该流做什么,对其来源都没有任何影响

因此,无需涉及临时文件 - 只需根据需要修改stdin输入

#!/bin/bash

sed 's/the/THE/g'  # without a filename operand or pipe input, this will read from stdin
# Without an output redirection, the output will go to stdout.

正如您所知,在这个简单的情况下,您也可以直接使用sed命令,而无需创建脚本。

答案 1 :(得分:0)

使用此:

temp=$(sed 's/the/THE/' <<<"$temp")

temp=$(printf "%s" "$temp" | sed 's/the/THE/')

您告诉sed处理名为temp的文件,而不是变量$temp的内容。您也没有将结果保存在任何位置,因此echo "$temp"只打印旧值

答案 2 :(得分:-1)

这是一种按照你所描述的方式进行的方式

#!/bin/sh

# Read the input and append to tmp file
while read LINE; do
   echo ${LINE} >> yourtmpfile
done

# Edit the file in place
sed -i '' 's/the/THE/g' yourtmpfile

#Output the result
cat yourtmpfile
rm yourtmpfile

这是一种没有tmp文件的简单方法

#!/bin/sh

# Read the input and output the line after sed
while read LINE; do
   echo ${LINE} | sed 's/the/THE/g'
done