bash交互式线路更换

时间:2015-07-09 12:20:10

标签: linux bash shell sed

我有一个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,那么天真的计数器似乎不是可行的方法。

2 个答案:

答案 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"