Bash提示替换文件中的字符串和变量?

时间:2017-07-31 07:35:19

标签: bash

所以我正在研究如何组合一个Bash脚本,该脚本可以提示用于在文件中的文件中大量更改字符串和变量,并将更改应用于具有该字符串或变量的所有文件到新文件。

例如,我有一堆文件,其中包含一个带数字值的字符串,我想将其更改为新值,即;

font-size=30

并且假设我想将30改为25的不同数值。我知道这可以通过这样做来实现;

find . -type f -exec sed -i 's/font-size=30/font-size=25/g' {} \;

但是如果我希望让用户通过在bash提示符中输入自己来改变任何值是难以处理的,就像这样,即;

Search and replace all font values of %n
Font size Value = 30
Enter new value: 

我如何能够将此作为要求用户输入的难以处理的提示?因此,不仅可以搜索和替换属于Font-size=的所有值的实例,还可以搜索和替换其他值,例如xy位置值。

我基本上要做的就是制作一个提示菜单,您必须从菜单中选择您想要做的事情,然后按照我上面的描述进行操作。给它一个输入文件,或者包含一堆文件的目录,例如,采取以下内容;

Choose from menu [1-3]:

1 - Replace Font-size values
2 - Replace X and Y values
3 - Exit

- - -
Select file or directory target: <user_input_here>

2 个答案:

答案 0 :(得分:1)

您可以使用read创建交互式bash脚本。有关此实用程序的详细信息,请参阅相应的manpage

请看以下示例,您可以轻松扩展到您的需求:

#!/bin/bash

function replace_fontsize {
  read -p "Old font-size: (Press Enter) " old_size
  read -p "New font-size: (Press Enter) " new_size
  read -p "Select file or directory target: (Press Enter) " path
  if [ -d "$path" ] ; then
    find "$path" -type f -exec sed -i 's/font-size=${old_size}/font-size=${new_size}/g' {} \;
  elif [ -f "$path" ] ; then
    sed -i 's/font-size=${old_size}/font-size=${new_size}/g' "$path"
  else
    echo "File/Directory ${path} doesn't exist"
    exit 1
  fi
}

function replace_x_and_y {
  # do whatever you want
  exit 0
}

echo "Choose from menu [1-3]:

1 - Replace Font-size values
2 - Replace X and Y values
3 - Exit"

read -n 1 -s menu

case $menu in
  1) replace_fontsize;;
  2) replace_x_and_y;;
  3) exit 0;;
esac

答案 1 :(得分:0)

#!/usr/bin/env bash

# put any X here for X in the format X=<number>
options=("font-size" "x")

echo "Choose from menu [1-$((${#options[@]}+1))]"
index=1
for i in ${options[@]}; do
    echo -e "\t$((index++)) - $i"
done
echo -e "\t$((index)) - exit"

read -p 'select: ' sel                                                                                                                                
if ! [[ $sel =~ [1-9][0-9]* ]]; then
    echo "invalid selection. enter a number greater than 0"
    exit 1
fi
if [[ $sel -eq $index ]]; then
    echo "exiting.."
    exit 0
fi
echo "updating '${options[$((--sel))]}'"
read -p "enter the old value: " oval
read -p "enter the new value: " nval
echo "updating '${options[$sel]}=$oval' into '${options[$sel]}=$nval'"

# change the directory here if required and update the find query as needed
find . -type f -exec sed -i "s:${options[$sel]}=$oval:${options[$sel]}=$nval:g" {} \;