grep&x2B;grep&x2B;sed=sed:没有输入文件

grep&x2B;grep&x2B;sed=sed:没有输入文件,sed,grep,Sed,Grep,有人能帮我吗 grep " 287 " file.txt | grep "HI" | sed -i 's/HIS/HID/g' sed: no input files 还尝试了xargs grep " 287 " file.txt | grep HI | xargs sed -i 's/HIS/HID/g' sed: invalid option -- '6' 这个很好用 grep " 287 " file.txt | grep HI 如果您想保留您的管道: f=file.txt tm

有人能帮我吗

grep " 287 " file.txt | grep "HI" | sed -i 's/HIS/HID/g' 

sed: no input files
还尝试了xargs

grep " 287 " file.txt | grep HI | xargs sed -i 's/HIS/HID/g'
sed: invalid option -- '6'
这个很好用

grep " 287 " file.txt | grep HI

如果您想保留您的管道:

f=file.txt
tmp=$(mktemp)
grep " 287 " "$f" | grep "HI" | sed 's/HIS/HID/g' > "$tmp" && mv "$tmp" "$f"
或者,简化:

sed -i -n '/ 287 / {/HI/ s/HIS/HID/p}' file.txt
这将过滤掉任何不包含“287”和“HI”的行——这就是您想要的吗?我怀疑你真的想要这个:

sed -i '/ 287 / {/HI/ s/HIS/HID/}' file.txt
对于与
/287/
匹配的行,执行大括号中的命令。在那里,对于匹配
/HI/
的行,搜索第一个“HIS”并替换为“HID”。如果未指定
-n
,则sed隐式打印所有行

执行相同操作的其他命令:

awk '/ 287 / && /HI/ {sub(/HIS/, "HID")} {print}' file.txt > new.txt
perl -i -pe '/ 287 / and /HI/ and s/HIS/HID/' file.txt

awk没有“就地”选项(对于最新的gawk版本,除了
gawk-i inplace

-i
用于“就地编辑”,您无法“就地编辑”流,因此
sed
需要一个文件,但您没有给它任何文件。是的,但是如果我删除-我不会将其写入文件…这些命令都不会写入文件。如果您想将
sed
的输出转到一个文件,则需要将其重定向到一个文件<代码>-我帮不了你。你也不能把
>file.txt
放在末尾,因为这样会先截断。也就是说,
sed
可以为您完成所有过滤,因此您根本不需要
grep
。grep“287”file.txt | grep“HI”| sed's/HIS/HID/g'这只打印输出,但无法保存它,就像我刚才说的那样,您需要将输出重定向到一个文件(例如,在最后放入
>newfile.txt
)。或者,只需让
sed
找到与这些模式匹配的行,然后您就可以使用
-i
。是的,最后一行工作得很好,您能解释一下吗?我如何将file.txt更改为$1$1是运行sh时的用户输入。您认为您将如何做到这一点?建议您提出一个新问题