$
соответствует концу строки, поэтому ваш шаблон должен быть )$
, а не $)
, как в вашем примере.
Также здесь не нужен xargs
, безопаснее использовать флаг -exec
в fine
:
find . -name test.txt -exec sed -i '/PATTERN/ s/)$/); /' '{}' +
Если ваша версия find не работает с +
в конце, то используйте \;
вместо этого (спасибо @glenn-jackman):
find . -name test.txt -exec sed -i '/PATTERN/ s/)$/); /' '{}' \;
Наконец, нет необходимости во флаге g
в идиоме s/something$//
, поскольку в каждой строке есть только одно вхождение $
.
Надеюсь, цикл for
не нужен. попробуй это,
DIRECTORY_PATH=/path/to/dir
FILE_LIST=(`ls -p $DIRECTORY_PATH | grep -v / `)
printf '%s\n' "${FILE_LIST[@]}" | nl -v 1
read -r -p "please enter index number to open: " fileNO
cat $DIRECTORY_PATH/${FILE_LIST[$fileNO]}
FILE_LIST
список только файлов в данном каталоге printf
чтобы перечислить массив файлов один за другим nl
номер каждой строки read
для получения ввода во время выполнения cat
файл, индексируя массив