所以我正在研究如何组合一个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=
的所有值的实例,还可以搜索和替换其他值,例如x
和y
位置值。
我基本上要做的就是制作一个提示菜单,您必须从菜单中选择您想要做的事情,然后按照我上面的描述进行操作。给它一个输入文件,或者包含一堆文件的目录,例如,采取以下内容;
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>
答案 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" {} \;