我需要:
从管道中接受我脚本中的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:没有这样的文件或目录”
我曾尝试搜索解决方案但找不到解决方案。
非常感谢帮助,谢谢。
答案 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