我需要删除剪贴板中包含的文本格式,但保留一些元素。最重要的是“新线”角色。在一个简单的脚本中,效果如下
variable=$(xsel --clipboard)
问题是文本似乎都在同一行中,因此它丢失了所有“换行”字符。
1)有办法避免这种情况吗?有时我从 Windows 格式复制文本(因此换行符是“\r\n”),有时从 *nix 复制文本(因此换行符只是“\n”)。
2)上一个问题是最重要的,但是:还有一种方法可以保留“粗体”,“斜体”和“下划线”格式元素吗?因为这些 shell 命令也都丢失了。
不管怎样,谢谢你!
答案1
是的。命令替换会删除每个尾随换行符1。
要解决这个问题:
var=$(xsel --clipboard; echo .)
var=${var%?}
那就是添加.\n
到该输出中。然后用${var%?}
(\n
由命令替换来处理)删除点。
请注意,除了 with 之外zsh
,shell 变量不能包含 NUL 字节。
如果你想保留退出状态:
var=$(xsel --clipboard; ret=$?; echo .; exit "$ret")
ret=$?
var=${var%?}
$var
扩展时记得引用:
printf %s "$var"
辅助函数:
cmdsubst() {
_var=$1; shift
eval "$_var="'$("$@"; ret=$?; echo .; exit "$ret")
_ret=$?
'"$_var=\${$_var%?}"
return "$_ret"
}
用作:
cmdsubst var xsel --clipboard
为了保留“粗体”...除了 UTF8 字符串之外,某些工具还将 CLIPBOARD 选择导出为 text/html。在这种情况下(使用最新版本的xclip
),您可以执行以下操作:
cmdsubst html xclip -sel c -o -t text/html
查看输出xclip -sel c -o -t TARGETS
以了解 CLIPBOARD 选择的当前所有者提供的选择目标。
将我的部分评论复制到上面的iceweasel中的Mikel后的示例:
$ xclip -sel c -o -t TARGETS
TIMESTAMP
TARGETS
MULTIPLE
SAVE_TARGETS
text/html
text/_moz_htmlcontext
text/_moz_htmlinfo
UTF8_STRING
COMPOUND_TEXT
TEXT
STRING
text/x-moz-url-priv
$ xclip -sel c -o -t text/html
<span class="comment-copy"><i>should</i> remove <i>only one</i> trailing newline</span>
$ xclip -sel c -o -t TEXT
should remove only one trailing newline
1一个例外是该系列的 shell,rc
您可以说您不希望使用该var = ``(){xsel --clipboard}
语法进行任何后处理。