我有这个文本文件
1221#John#baseball
31231#Nick#football
......
我想在bash中创建一个像这样的命令
command new value column id
这将更改具有新值的特定ID的用户给出的列 我曾尝试使用sed,awk,grep和它们的一些组合,但没有任何效果。
答案 0 :(得分:0)
好的,我不能发表评论,所以我会尝试以答案的形式这样做。
根据您的陈述,您希望USER能够通过运行命令来编辑其行,如下所示:
command [new value] [column id]
所以这就是我要写的剧本:
#!/bin/bash
newval="$1"
column="$2"
#Set your file below since you don't want to do it in the command use the full path
file="filename.txt"
#Reject any column 2 as you don't want users editing their ID
if [[ "$column" == "2" ]]; then
echo "Invalid column ID, can not change username"
exit 1
fi
#Find the username and look up the designated column
oldval=`grep "$USER" "$file" | awk -F "#" '{print $'$column'}'`
#Find line number so we know which to edit
linenum=`grep -n "$USER" "$file" | awk -F ":" '{print $1}'`
#Make the string to feed into sed as the preceding variable causes errors
string=$linenum"s/$oldval/$newval/g"
#Find the old value and replace it with the new value
sed -i "$string" $file
这样您就可以按照指定的方式运行命令。与任何命令一样,如果任何值中都有空格,则应使用引号来获取正确的值。
此外,如果该号码是用户ID,请按如下所示更改脚本:
添加:
UserID=`id -u`
变化:
if [[ "$column" == "1" ]]; then
变化:
oldval=`grep "$UserID" "$file" | awk -F "#" '{print $'$column'}'`
linenum=`grep -n "$UserID" "$file" | awk -F ":" '{print $1}'`