我有一个bash循环移动文件中的行,我想知道是否有办法以交互方式用内容替换每一行。
while read p
do
echo $p
read input
if [ "$input" == "y" ]; then
# DO SOME ON P REPLACEMENT HERE
done<$fname
从read(3)开始,我知道从文件描述符读取副本到*缓冲区。我意识到我可以直接使用sed替换,但不能让它在这个bash循环上下文中工作。例如,假设我想要包装选定的行:
sed 's/\(.*\)/wrap \(\1\)/'
复杂化:bash'read'命令吞下'\'并继续读'line'(这就是我正在寻找的)。 Sed似乎不是。这意味着行数会有所不同,所以如果要使用sed,那么天真的计数器似乎不是可行的方法。
答案 0 :(得分:1)
使用ex
,这是vim
的非可视模式(它就像较新的ed
):
ex -c '%s/\(.*\)/wrap \(\1\)/c' FILE
请注意,我需要分别在%
表达式的开头和结尾添加c
(对所有行执行操作)和sed
(替换前提示)。< / p>
出现提示时,输入y<CR>
替换,n<CR>
不替换,q<CR>
停止替换命令。输入q<CR>
或到达文件末尾后,您可以使用w<CR>
保存更改(这将覆盖文件),然后使用q<CR>
退出。
或者,您可以使用ed
,但我不会帮助您。 ;)
有关ex
的更多常规信息,请查看以下问题:
https://superuser.com/questions/22455/vim-what-is-the-ex-mode-for-batch-processing-for
答案 1 :(得分:0)
我不确定我理解你需要什么,也许你可以给我们更多细节,比如样本输入和预期输出。也许这有用吗?
while read p
do
echo "$p"
read input
if [ "$input" == "y" ]
then
# Sed is fed with "p" and then it replaces any input with a given string.
# In this case "wrap <matched_text>". Its output is then assigned again to "p"
p="$(sed -nre 's/(.*)/wrap \1/p' <<< "$p")"
fi
done < "$fname"