我想计算文件中空白字符的数量。我能想到的最好的办法是:
tr -cd [:space:] < my_file | wc
Run Code Online (Sandbox Code Playgroud)
有更简洁的方法吗?
我不幸地处理了包含空格的文件名。我想连接文件名包含空格的文件。我还想按数字对文件名进行排序。显然以下失败:
cat $(ls *.sql | sort -n)
Run Code Online (Sandbox Code Playgroud)
因为foo bar.sql作为两个参数传递给cat. 这里通常的方法是什么?
我的 shell 脚本中有以下代码片段,并且有一个错误,尽管进行了一些研究,但我似乎无法确定原因。当我运行如下代码时,脚本退出并显示一条消息
./my_script.sh: line 53: syntax error at line 61: `<<' unmatched
Run Code Online (Sandbox Code Playgroud)
我已经使用过set -x并且可以看到在出现错误之前一切都很好(无论如何我只设置了变量)。出于某种原因,只需从eot允许它工作之前删除空格(它们是空格而不是非显示字符)。它让我的 xml 看起来有点不对齐但功能正常。有谁知道为什么会发生这种情况,因为我不喜欢这样的事情,我无法解释,我希望我的 xml 看起来也很漂亮。
这是脚本的相关部分:
# ... various environment variables set here ...
clean_files() # line 53
{
# Clear up the intermediate files
mv $datafile $ARCHIVE_DIR/$(basename $datafile).$$
}
xmlfile_header()
{ # line 60
cat <<- eot
<?xml version="1.0" encoding="UTF-8" ?>
<ppllist>
eot
}
# ... more stuff ...
Run Code Online (Sandbox Code Playgroud) 以下内容在命令行上效果很好:
$ ffmpeg -i input.m4a -metadata 'title=Spaces and $pecial char'\''s' output.m4a
Run Code Online (Sandbox Code Playgroud)
如何参数化此命令并在脚本/函数中使用它?我想添加多个元数据标签,如下所示:
$ set-tags.sh -metadata 'tag1=a b c' -metadata 'tag2=1 2 3'
Run Code Online (Sandbox Code Playgroud)
更新:
我把我的问题简化得有点太多了。我实际上想调用一个脚本,该脚本使用其中的参数化命令来调用脚本。
这是我的确切用例:
此函数将文件转换为有声读物格式(在 .profile 中定义):
# snippet of .profile
convert_to_m4b () {
FILE="$1"
BASENAME=${FILE%.*}; shift
ffmpeg -i "$FILE" -vn -ac 1 -ar 22050 -b:a 32k "$@" tmp.m4a &&
mv tmp.m4a "$BASENAME.m4b"
}; export -f convert_to_m4b
Run Code Online (Sandbox Code Playgroud)
函数convert_to_m4b是从download-and-convert.sh中调用的:
#/bin/sh
MP3_URL=$1; shift
FILENAME=$1; shift
if [ ! -f "${FILENAME}.mp3" ]; then
curl --location --output "${FILENAME}.mp3" "$MP3_URL"
fi
convert_to_m4b "${FILENAME}.mp3" "$@" …Run Code Online (Sandbox Code Playgroud) 我得到的很好的例子:
尝试ss -axl显示正在侦听的 UNIX 域套接字。例如,这可能会给出:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
u_str LISTEN 0 0 /run/systemd/private 9683 * 0
u_str LISTEN 0 0 /run/systemd/fsck.progress 9690 * 0
u_str LISTEN 0 0 /run/systemd/journal/stdout 9705 * 0
u_str LISTEN 0 0 /var/run/dbus/system_bus_socket 13830 * 0
u_str LISTEN 0 0 /run/thd.socket 13833 * 0
u_str LISTEN 0 0 /var/run/docker.sock 13835 * 0
u_str LISTEN 0 0 /run/avahi-daemon/socket 13837 * 0
u_str LISTEN 0 0 /run/user/1000/systemd/private 16088 * 0
u_str …Run Code Online (Sandbox Code Playgroud)我想有选择地替换正在传递的命令行参数,以自动格式化它以适应正在执行的下游命令。论证会有空格,这就是争论的焦点。
我目前正在这样做:
set -- $(echo $* | sed -e "s/$_ARG/--description=\"$_ID - $_SUMMARY\"/")
Run Code Online (Sandbox Code Playgroud)
新的论点--description="$_ID - $_SUMMARY"被分裂了。
我运行下游命令:
<cmd> "$@"
Run Code Online (Sandbox Code Playgroud)
我可能有任意数量的参数,但示例用例是:
从
activity --description='handle null'
Run Code Online (Sandbox Code Playgroud)
到:
activity --description='$SOME_VARIABLE - handle null'
Run Code Online (Sandbox Code Playgroud)
最终,当我运行下游命令时,即使使用“$@”,它也已经在那里分割,所以它不能按我的预期工作。它最终就像
activity --description=value - handle null
Run Code Online (Sandbox Code Playgroud)
--description=value、-、handle、null然后被视为单独的参数。
我想搜索其中包含名称 libre 的文件,然后删除它们。我在这里完成了一半并且找不到删除文件的可靠方法,尤其是当文件名中有空格时。
find -iname *libre*
Run Code Online (Sandbox Code Playgroud)
这将搜索文件,但假设一个文件是“Libre Office Word”,现在它有空格,你能指导如何删除这些文件吗?
我想在ls命令输出的每一行末尾添加一个带空格的字符串。
#!/bin/sh
STRING_WITH_SPACES="this should be at the end of output"
ls -lh | sed 's|$| '$STRING_WITH_SPACES'|'
Run Code Online (Sandbox Code Playgroud)
当$STRING_WITH_SPACES没有空格时,上面的脚本工作正常:
-rw-r--r-- 1 me users 0 May 4 14:55 testfile thisshouldbeattheend
Run Code Online (Sandbox Code Playgroud)
但是,当$STRING_WITH_SPACESsed 中有空格时会抱怨:
sed: -e expression #1, char 9: unterminated `s' command
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
我有包含记录的文件
qwe.google.com IN A 1.1.1.1
qwe.google.com IN {uneven-space} A{space}1.1.1.1
qwe.google.com IN CNAME asd.google.com
Run Code Online (Sandbox Code Playgroud)
我需要 grep 包含的所有行IN A,因为它之间包含不均匀的空间,我无法这样做。
在以下示例中,inet 前有 4 个空格。
wolf@linux:~$ ip address show eth0 | grep 'inet '
inet 10.10.10.10/24 brd 10.10.10.255 scope global dynamic eth0
wolf@linux:~$
Run Code Online (Sandbox Code Playgroud)
我如何计算这个例子中的空格数。
这个示例很简单,因为它只有 4 个空格。
如果它有更多呢?几百,几千?
是否有捷径可寻?